По ходу работы выяснилось много забавного.
1 Нельзя открывать ком-порт в конструкторе формы (не страшно).
2 Чтобы работать с портом необходимо считать-установить (даже не меняя) его характеристики. Стандартными средствами framework это не получилось (возможно и можно, но очень сложно).
3 Нельзя оставлять порт открытым при выходе из любого метода формы (это очень нужно!)
4 Вывод информации на форму не получился (тоже очень нужно)
У кого есть идеи?
Вот примерный код:
public class Form1 : System.Windows.Forms.Form {
private RS232 com;
public Form1() {
InitializeComponent();
com=new RS232(new RS232.Trap(trap));
}
private void button1_Click(object sender, System.EventArgs e) {
com.put("Hello");
com.hear();
//com.close();
}
private bool trap(byte b) {
string s="";
s+=(char)b;
textBox2.Text+=s;
return false;
}
}
public class RS232 {
public delegate bool Trap(byte b);
public RS232(Trap trap) {
_trap=trap;
hear();
}
public unsafe bool open() {
if (_port!=-1) return true;
_port=CreateFile("COM1:", GENERIC_READ | GENERIC_WRITE, 0, null, OPEN_EXISTING, 0, 0);
if (_port==-1) return false;
DCB dcb=new DCB();
...
return true;
}
public unsafe int put(byte[] s) {
if (s.Length<1 || !open()) return 0;
int j=0;
for (int i=0; i<s.Length; i++) {
uint n=0;
byte b=s[i];
WriteFile(_port, &b, 1, ref n, null);
j+=(int)n;
}
Thread.Sleep(10);
return j;
}
public void hear() {
if (_receiver!=null) return;
_stop=false;
_receiver = new Thread(new ThreadStart(receiver));
_receiver.Start();
Thread.Sleep(0);
}
private unsafe void receiver() {
while (!_stop) {
uint n=0;
if (_port!=-1) do {
byte b;
ReadFile(_port, &b, (uint)Marshal.SizeOf(b), ref n, null);
if (n>0 && _trap!=null) _trap(b);
} while (n>0);
Thread.Sleep(1);
}
_stop=false;
}
}
30.09.03 18:09: Перенесено модератором из '.NET' — AVK