从影响值的串行端口读取
本文关键字:串行端口 读取 影响 | 更新日期: 2023-09-27 18:30:37
我有点头疼,试图从SerialPort
课上正确阅读。
如果我使用阻止方法ReadLine
或ReadExisting
则应用程序的工作方式类似于魅力,但由于string
转换,我的某些值会受到影响。即:0xFC
字节显示为0x3F
("?")。我的猜测是,ASCII 范围之外的任何值也会丢失。
我尝试使用 Read(byte[] buffer,int offset,int count)
方法使用 SerialPort.ReadBufferSize
查看我应该读取多少字节,但它总是返回近 5000 ,即使我尝试从 UART 读取大约 8 个字节。我必须创建一个函数来将此数组修剪为较小的数组并使用它。即使它效率不高,我也可以使用这种方法,但我有时会使用它出现数组越界执行错误。调试后,我发现当我读取完整的零数组时会发生这种情况。
我最后一次尝试是使用以下代码:
private void DataRec(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
byte[] myarray = new byte[200];
int pos = 0;
bool eol = false;
while (!eol)
{
myarray[pos++] = (byte) sp.ReadByte();
if (myarray[pos] == 0x7E) eol = true;
}
byte[] newarray = Recorta(myarray);
this.Dispatcher.Invoke(new AtualizaCallBack(this.atualiza), new object[] { newarray });
sp.DataReceived -= DataRec;
}
调试时,我永远不会到达byte[] newarray = Recorta(myarray);
断点,但没有错误。奇怪的是,每当事件再次触发时(我告诉UART给我发送一个数据包),pos
变量都不会从零开始。
对可能发生的事情有什么想法吗?
一些值得一提的事情:
- 0x7E "~"是我的行尾字符
- 200 是我一次收到的最大字节数
- UART代码一次发送一个字节的数据,但仅在收到正确的请求后
您只是使用了 SerialPort 类的错误成员。 ReadLine() 和 ReadExisting() 返回字符串,但数据不能存储在字符串中。 0xFC没有 ASCII 字符代码,因此它只是放弃并产生"无法转换该字节"值。 这0x3F,一个问号。
同样,ReadBufferSize 是一个固定数字,除非您重新分配该值。 它设置串行端口驱动程序用于在程序读取之前存储接收字节的缓冲区的大小。 充其量,您会对 BytesToRead 属性感兴趣。 这告诉您有多少字节可用于在该缓冲区内读取。
只需使用 SerialPort.Read() 方法即可。 并且一定要注意它的返回值,它告诉你读取了多少字节。 这几乎总是一个小数字,通常是一个或两个字节。 串行端口速度较慢。 您需要继续阅读,直到获得设备的完整响应。 在你得到那个0x7E的情况下。
试试这个。我认为大多数情况下你没有正确实现它。
private byte[] ReadLine(SerialPort serialPort)
{
byte[] buffer = new byte[4096];
int count = 0;
for (; count < buffer.Length; count++)
{
buffer[count] = (byte)serialPort.ReadByte();
if (buffer[count] == 0x7E) break;
}
return buffer.Take(count);
}