【求助】关于c#串口通信 提取数组数据的问题

Leo_Cho 2017-12-07 02:31:45
目前想写一个串口接收数据的小程序(运用serialport类),数据持续发送中,希望从数据中提取部分数据解码为十进制显示出来
下面是程序中的一部分,程序生成编译无错误,但在执行时,系统报错
小弟C#信任,希望大神能够给予帮助,万分感谢
private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] ReDatas = new byte[ComDevice.BytesToRead];
ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据
this.AddData(ReDatas);//输出数据
string str_distance = System.Text.Encoding.Default.GetString(ReDatas, 7, 8);
long distance = Convert.ToInt64(str_distance,16);
string s = distance.ToString();
label9.Text = s;
}
程序中我尝试了一下,如果直接输出str_distance是没有问题的,但是按照上述程序输出s,运行系统就会报错,十分困惑。是不是在解码过程出现问题了呢?
...全文
503 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_37971462 2017-12-29
  • 打赏
  • 举报
回复
引用 11 楼 qq_38588710 的回复:
[quote=引用 10 楼 qq_38588710 的回复:] 可能是跨线程访问UI
我错了,没有认真看回复,针对你后续的问题,你应该把接收到的数据放在一个缓存中如list,在另一个线程中对list进行包头包尾的查找也就是分包,再进行数据的处理,太久没上论坛,没错,我胡汉三又回来了 [/quote] 针对楼上所说的list 建议用线程安全的泛型,现在我就是碰到一个问题。异步显示数据的时候时间长会同时操作LIST导致报错,
易2017 2017-12-28
  • 打赏
  • 举报
回复
引用 10 楼 qq_38588710 的回复:
可能是跨线程访问UI
我错了,没有认真看回复,针对你后续的问题,你应该把接收到的数据放在一个缓存中如list,在另一个线程中对list进行包头包尾的查找也就是分包,再进行数据的处理,太久没上论坛,没错,我胡汉三又回来了
易2017 2017-12-28
  • 打赏
  • 举报
回复
可能是跨线程访问UI
Benjay77 2017-12-28
  • 打赏
  • 举报
回复
串口通讯会有延时 不会实时获取的 自己加个thread.sleep(500)看看
yunqing1201 2017-12-27
  • 打赏
  • 举报
回复
private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e) { if(ComDevice.BytesToRead <15) return; //加上这一句,这只是简单处理, byte[] ReDatas = new byte[ComDevice.BytesToRead]; ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据 this.AddData(ReDatas);//输出数据 string str_distance = System.Text.Encoding.Default.GetString(ReDatas, 7, 8); long distance = Convert.ToInt64(str_distance,16); string s = distance.ToString(); label9.Text = s; }
Leo_Cho 2017-12-26
  • 打赏
  • 举报
回复
引用 1 楼 qq_25623357 的回复:
报的什么错,什么位置报错?打断点F10调试看看,目前 string str_distance = System.Text.Encoding.Default.GetString(ReDatas, 7, 8);//ReDatas长度小于15会报错
你好,很抱歉隔了这么久才回复,在调试过后,之前的问题存在于往textbox写的时候,线程之间的冲突。现在软件可以使用,但又有了新的问题,希望能够得到各位的解答。 我在程序调试的过程中,我发现bytestoread的值是一直在变化的,但是我提取数据的程序如下: string str_distance = System.Text.Encoding.Default.GetString(data1, 6, 8); 靠着这个语句,我认为应该会存在大量的丢包,因为bytestoread的值有时候很大,直接存入数组后,程序只提取了当前数组的一部分,那么还有很多其它有效的数据应该是丢失的,但是在测试过程中,并没丢失,所以对C#的串口读取过程还不太理解,希望得到解答!
Leo_Cho 2017-12-26
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
string str_distance = System.Text.Encoding.Default.GetString(ReDatas, 7, 8); long distance = Convert.ToInt64(str_distance,16); 这些处理都是和长度有关, 如果接收的数据长度不够,那肯定报错 所以接收数据要先判断长度, 满足条件后再进行解析
你好,很抱歉隔了这么久才回复,在调试过后,之前的问题存在于往textbox写的时候,线程之间的冲突。现在软件可以使用,但又有了新的问题,希望能够得到各位的解答。 我在程序调试的过程中,我发现bytestoread的值是一直在变化的,但是我提取数据的程序如下: string str_distance = System.Text.Encoding.Default.GetString(data1, 6, 8); 靠着这个语句,我认为应该会存在大量的丢包,因为bytestoread的值有时候很大,直接存入数组后,程序只提取了当前数组的一部分,那么还有很多其它有效的数据应该是丢失的,但是在测试过程中,并没丢失,所以对C#的串口读取过程还不太理解,希望得到解答!
Leo_Cho 2017-12-26
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
也许接受的数据没有那么长呢,会调试程序比编码还重要。 http://www.cnblogs.com/alexis/archive/2010/11/06/1870519.html
你好,很抱歉隔了这么久才回复,在调试过后,之前的问题存在于往textbox写的时候,线程之间的冲突。现在软件可以使用,但又有了新的问题,希望能够得到各位的解答。 我在程序调试的过程中,我发现bytestoread的值是一直在变化的,但是我提取数据的程序如下: string str_distance = System.Text.Encoding.Default.GetString(data1, 6, 8); 靠着这个语句,我认为应该会存在大量的丢包,因为bytestoread的值有时候很大,直接存入数组后,程序只提取了当前数组的一部分,那么还有很多其它有效的数据应该是丢失的,但是在测试过程中,并没丢失,所以对C#的串口读取过程还不太理解,希望得到解答!
吹风的兔子 2017-12-26
  • 打赏
  • 举报
回复
看你的代码,似乎 串口通讯 和 Socket 通讯 相似的地方 有很多。 > 比如你的 一个包 8byte > 实际接收时,可能一会儿 接收 3 byte,一会儿接收 200 byte > 这个时候,就需要你 自己学会 将字节分组。 一般处理方式是: > 获取到的字节 你不能 直接使用。 > 你要将 所有获取到的字节 存入一个 MemoryStream。 > 然后再 循环判断: MemoryStream.Length >=8,如果 是 则将这8位 取出来使用,将 MemoryStream 前8位去掉。 > 直到 MemoryStream.Length<8,继续接收,继续循环处理,继续 等待接收。
exception92 2017-12-07
  • 打赏
  • 举报
回复
也许接受的数据没有那么长呢,会调试程序比编码还重要。 http://www.cnblogs.com/alexis/archive/2010/11/06/1870519.html
xian_wwq 2017-12-07
  • 打赏
  • 举报
回复
string str_distance = System.Text.Encoding.Default.GetString(ReDatas, 7, 8); long distance = Convert.ToInt64(str_distance,16); 这些处理都是和长度有关, 如果接收的数据长度不够,那肯定报错 所以接收数据要先判断长度, 满足条件后再进行解析
_jiasong 2017-12-07
  • 打赏
  • 举报
回复
报的什么错,什么位置报错?打断点F10调试看看,目前 string str_distance = System.Text.Encoding.Default.GetString(ReDatas, 7, 8);//ReDatas长度小于15会报错

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧