C#同时接收和发送串行字节bug
C# Receive and transmit serial bytes at the same time bug
我正在使用我的应用程序时突然意识到,如果我在读取一个字节时传输一个字节,我可能会遇到串行端口错误。我开始测试并在 5 秒内完成,宾果游戏.我没有错过接收到的字节。但是我的程序会停止正常工作。我们使用某种协议,当它接收到奇怪的字节时,它可能会卡住。类似的事情发生了。
为了发送字节,我使用按钮,按钮事件调用发送字节的函数。
serial.Write(toSend, 0, 1)
为了读入,我使用调用处理数据的后台工作程序的串行事件。
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
lock (_lock)
{
rxBuffer += serial.ReadExisting();
}
try { backgroundWorker1.RunWorkerAsync(); } catch { }
}
控制台输出
Bullseye set at (0,1)
9:44:52 << 0x80
9:44:52 << 0x3
9:44:52 << 0xA
Bullseye set at (1,1)
9:44:52 << 0x80
9:44:52 << 0x3
9:44:52 << 0xB
Bullseye set at (2,1)
9:44:52 << 0x80
9:44:52 0x95 >>
9:44:52 << 0x3
9:44:52 << 0xC <-- bullseye didn't get set
9:44:53 << 0x80
后台也使用锁功能
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//private void serialReceived(object s, EventArgs e)
//{
while (rxBuffer.Length > 0)
{
lock (_lock)
{
// textBox1.Text += rxBuffer[0];
byte b = Convert.ToByte(rxBuffer[0]);
string hexValue = b.ToString("X");
rxBuffer = rxBuffer.Remove(0, 1);
我不知道为什么按钮事件会干扰后台工作程序。我确实看到我收到了所有字节
我终于解决了大部分问题。我花了很多时间在谷歌上搜索,但我找到了如何使用 beginInvoke()。与常规 Invoke 不同,beginInvoke 似乎没有那么慢。然而,当机器向我的目标设备发送太多字节时,它仍然会死机
所以现在我摆脱了后台工作人员并使用它。但我仍然更喜欢使用后台工作者,因为它对我来说似乎更快。但是我不能,我不知道怎么办。
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e) // the Main serial receiving event.
{
lock (_lock)
{
rxBuffer += serial.ReadExisting();
}
serialReceived(rxBuffer);
}
private void serialReceived(string value)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new serialReceivedDelegate(serialReceived), new object[] { value });
}
else
{
lock (_lock)
{
我正在使用我的应用程序时突然意识到,如果我在读取一个字节时传输一个字节,我可能会遇到串行端口错误。我开始测试并在 5 秒内完成,宾果游戏.我没有错过接收到的字节。但是我的程序会停止正常工作。我们使用某种协议,当它接收到奇怪的字节时,它可能会卡住。类似的事情发生了。
为了发送字节,我使用按钮,按钮事件调用发送字节的函数。
serial.Write(toSend, 0, 1)
为了读入,我使用调用处理数据的后台工作程序的串行事件。
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
lock (_lock)
{
rxBuffer += serial.ReadExisting();
}
try { backgroundWorker1.RunWorkerAsync(); } catch { }
}
控制台输出
Bullseye set at (0,1)
9:44:52 << 0x80
9:44:52 << 0x3
9:44:52 << 0xA
Bullseye set at (1,1)
9:44:52 << 0x80
9:44:52 << 0x3
9:44:52 << 0xB
Bullseye set at (2,1)
9:44:52 << 0x80
9:44:52 0x95 >>
9:44:52 << 0x3
9:44:52 << 0xC <-- bullseye didn't get set
9:44:53 << 0x80
后台也使用锁功能
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//private void serialReceived(object s, EventArgs e)
//{
while (rxBuffer.Length > 0)
{
lock (_lock)
{
// textBox1.Text += rxBuffer[0];
byte b = Convert.ToByte(rxBuffer[0]);
string hexValue = b.ToString("X");
rxBuffer = rxBuffer.Remove(0, 1);
我不知道为什么按钮事件会干扰后台工作程序。我确实看到我收到了所有字节
我终于解决了大部分问题。我花了很多时间在谷歌上搜索,但我找到了如何使用 beginInvoke()。与常规 Invoke 不同,beginInvoke 似乎没有那么慢。然而,当机器向我的目标设备发送太多字节时,它仍然会死机
所以现在我摆脱了后台工作人员并使用它。但我仍然更喜欢使用后台工作者,因为它对我来说似乎更快。但是我不能,我不知道怎么办。
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e) // the Main serial receiving event.
{
lock (_lock)
{
rxBuffer += serial.ReadExisting();
}
serialReceived(rxBuffer);
}
private void serialReceived(string value)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new serialReceivedDelegate(serialReceived), new object[] { value });
}
else
{
lock (_lock)
{