串行端口连接到应连续拍摄字节的设备。 使用DataBits 8将速度设置为BaudRate 9600
对串口进行一些测试:测试:1°开门,第2次接收数据,第3次接收数据测试 由于串口上的设备无法发布任何内容,我需要一个线程来确保程序不会永远等待。
下面的代码似乎有效,但实际上有时并不总是检测到门......
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();
}
}
答案 0 :(得分:0)
首先阅读一些弱点:
你认为你总是有两个字符。我想你知道这一点,你控制了源头
2.当你剪掉线程(中止)时,你不会照顾收据的实际情况:也许你此时只收到一个字符。
3.同样的事情:你的代码运行一次。什么都没有?你回来多久了?你可以放弃输入。
您可能最好让线程永远运行并使用某种通知。
H个