我有一个程序的问题,它从串行端口获取不可靠的数据,我相信www.example.com
这篇文章有一些答案-bytestorread值似乎不稳定,回调并不总是在数据存在时调用,所有默认的串行端口函数都不可靠,包括datareceived事件。这正是我在这个程序中遇到的。事实上,在微软的串口文档中到处都有声明和失败功能的注解。它没有的是这些问题的解决方案当它们出现在你的应用程序中时。
然而,当我尝试使用本文中提供的解决方案时,它似乎总是输出相同的第一个字节:"pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp我不知道。据我所知,这是完全相同的解决方案中提出的文章。这里是代码:
private void Form1_Shown(object sender, EventArgs e)
{
try
{
sp.Open();
SPDataHelper();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void SPDataHelper()
{
byte[] buffer = new byte[8000];
Action kickoffRead = null;
kickoffRead = delegate
{
sp.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar)
{
try
{
int actualLength = sp.BaseStream.EndRead(ar);
byte[] received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
sp_DataReceived(System.Text.Encoding.UTF8.GetString(received));//not called by the actual serialport anymore
}
catch (IOException exc)
{
WriteUUTWindow("Exception: "+exc.ToString());
}
kickoffRead();
}, null);
};
kickoffRead();
}
字符串
当我在"actuallength"赋值后设置断点时,它显示为1,这表明它在第一个字节之后永远不会读取。此后,赋值和回调的断点都不会再次到达,但应用程序继续发送"p"垃圾邮件。你知道这是怎么回事吗?
1条答案
按热度按时间iyr7buue1#
如果您对使用
BeginRead
感兴趣,请尝试以下操作-它已通过条形码扫描仪测试:创建一个类(名称:HelperSerialPort.cs)
选项1:
HelperSerialPort.cs
字符串
更新
这里有另一个版本,它似乎也工作,它使用了稍微修改过的代码版本。
选项2:
HelperSerialPort.cs
型
备选方案3
下面是一个使用SerialPort
DataReceived
的选项。HelperSerialPort.cs:
型
用法:
型
注意:确保完成SerialPort后调用
Dispose
。