>串行端口连接到应连续发射字节的设备。速度设置为波特率 9600,数据位为 8
所以在串口上做一些测试:测试:1°开门,第二次接收数据,第三次测试接收数据由于串行上的设备无法发布任何内容,因此我需要一个线程来确保程序不会永远等待。
下面的代码似乎有效,但实际上并不总是有时检测不到门......
bool EsitoTest = false;
private void rilevaPorta()
{
serialPorts = SerialPort.GetPortNames();
serialPort1.PortName = serialPorts[0];
Thread mythreadTest = new Thread(() => testPortaSeriale(serialPort1)); // Lambda expression
mythreadTest.Start();
Thread th = Thread.CurrentThread; // thread main
Thread.Sleep(500);
if (mythreadTest.IsAlive)
{
mythreadTest.Abort();
}
mythreadTest.Join();
if (EsitoTest) if (!comboBoxSeriale.Items.Contains(comPort)) comboBoxSeriale.Items.Add(comPort);
}
private void testPortaSeriale(SerialPort sPort)
{
int[] buffer = new int[2];
try
{
// FIRST TEST - OPENING THE DOOR
sPort.Open();
testPS1 = true;
serialPort1.DiscardInBuffer();
// SECOND TEST - RECEIVING DATA
int i = 0;
while (i < 2)
{
try
{
while (sPort.BytesToRead < 1) ; // attendi finchè non c'è il nuovo dato
buffer[i] = sPort.ReadByte();
i++;
}
catch (Exception ex)
{
EsitoTest = false;
}
if (i == 2)
{
testPS2 = true;
// THIRD TEST (OPZIONAL) - CONTROL VALUE DATA
if ((buffer[0] >= 0) & (buffer[0] <= 255) & (buffer[1] >= 0) & (buffer[1] <= 255))
{
testPS3 = true;
EsitoTest = true;
}
else
{
EsitoTest = false;
}
}
}
}
catch (Exception ex)
{
EsitoTest = false;
}
finally
{
sPort.Close();
}
}
作为一读的一些弱点:
1.你假设你总是有两个字符。我想你知道这一点,你控制了来源。
2.当你切断线程(中止(时,你没有照顾收据的实际情况:也许你此时只有一个字符。3.同样的事情:你的代码运行一次。如果什么都没有怎么办?你多久才能回来?您可以松散输入。
您可能最好让线程永远运行并使用某种通知。
呵呵