我正在使用我的应用程序,当我突然意识到我可以通过串口获得错误时,我将在读取一个字符时传输一个字节。我开始测试并在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);
我不知道为什么按钮事件会干扰后台工作人员。我确实看到我收到了所有字节
答案 0 :(得分:0)
我终于解决了我的大部分问题。我用了几个小时的谷歌搜索,但我已经找到了如何使用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)
{