【发布时间】:2013-09-09 12:31:26
【问题描述】:
我在尝试正确阅读 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 代码一次发送一个字节的数据,但只有在收到正确的请求后才能发送数据
【问题讨论】:
-
FCis 超出 ASCII 范围...可能这只是编码抖动?但是是的,使用基于byte的API 应该更可靠。您是否在检查ReadByte()是否返回负数? (表示 EOF) -
马克,感谢您的意见。这也是我的怀疑......至于EOF,正如我所说,它是0x7E“〜”。
标签: c# serial-port