C#串口读取数据问题,每次插入数据库都报substring越界。

sinat_22115895 2014-10-30 01:47:36
我想把串口接受到的70个字节(字节信息)分别插入数据库的不同列,但是substring会报错,是因为buf里面读取的n字节远远小于70字节。
延迟也用过了,serialport.ReceivedBytesThresold也设置为70了,但是还抱错,希望大神帮帮忙吧。

...全文
242 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序猿老曾 2014-10-31
  • 打赏
  • 举报
回复
你的设备有没有可以设置当波峰值稳定的时候再向COM发送数据的?? 我之前开发过一个称重的系统就是如果是不断的发送数据的话,你所截取的数据是不一致的,但是电子秤上可以设置STARN的,把它设置成稳定时发送一次,这就OK啦!!
sinat_22115895 2014-10-31
  • 打赏
  • 举报
回复

怎么老是有线程退出啊,还有数据库插不进去数据啊 @於黾

引用 15 楼 Z65443344 的回复:
上面>70改成>69
ReadTimeOut设置一下,比如200
这样如果发送方一共发送了不到70字节,超时会进入catch里,而不会就此进入死循环出不来

用之前,一定要再判断一下RecCount 到底是多少,如果不够70,就直接丢弃
S314324153 2014-10-31
  • 打赏
  • 举报
回复
可能有些数据长度不够,你先判断下要截取的字符是不是空,还有长度够不够
sinat_22115895 2014-10-31
  • 打赏
  • 举报
回复
引用 15 楼 Z65443344 的回复:
上面>70改成>69
ReadTimeOut设置一下,比如200
这样如果发送方一共发送了不到70字节,超时会进入catch里,而不会就此进入死循环出不来

用之前,一定要再判断一下RecCount 到底是多少,如果不够70,就直接丢弃


异步就是线程同时进行,无需等待啊


於黾 2014-10-30
  • 打赏
  • 举报
回复
上面>70改成>69 ReadTimeOut设置一下,比如200 这样如果发送方一共发送了不到70字节,超时会进入catch里,而不会就此进入死循环出不来 用之前,一定要再判断一下RecCount 到底是多少,如果不够70,就直接丢弃
於黾 2014-10-30
  • 打赏
  • 举报
回复
新手理解异步可能比较困难 你先改成如下这样吧:

            int RecCount = 0;

            while (true)
            {
                try
                {
                    OP.SP.Read(ref imbuffer, RecCount, 1);
                    RecCount++;

                    if (RecCount > 70)
                    {
                        break;
                    }
                }
                catch
                {
                    break;
                }
            }
sinat_22115895 2014-10-30
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
[quote=引用 11 楼 sinat_22115895 的回复:] [quote=引用 10 楼 Z65443344 的回复:] [quote=引用 7 楼 sinat_22115895 的回复:] 不懂
串口通信,数据是一个字节一个字节发送的,接收端接收的时候,任意时间去接收,你只能收到串口缓冲区里有的数据,而收不到还没有发送的数据 TCP是要么能收到完整的包,要么就什么都收不到,会等待包完整到达 而串口根本不存在包的概念[/quote] comm.Read(buf, 0, n);这个没有办法完全一次性读到串口缓冲区的n个字节吗,如何循环啊[/quote] 你理解有误 不是不能一次性读取缓冲区 而是缓冲区里不是一开始就有全部的数据 数据是一个字节一个字节发送到缓冲区里的 如何循环,要看你现在是用什么方式做的 如果现在是同步的方式,那么设置个读取超时时间,然后while循环去取,超时跳出循环 如果是串口接收回调事件,可以设置收到70字节才引发回调事件,或者回调事件里做拼接,然后判断如果已经收到足够70字节就开始处理[/quote] 我是不是要在连接数据库的前面代码中加入判断是否足够70字节?能否给点代码啊,我刚学几天。
於黾 2014-10-30
  • 打赏
  • 举报
回复
引用 11 楼 sinat_22115895 的回复:
[quote=引用 10 楼 Z65443344 的回复:] [quote=引用 7 楼 sinat_22115895 的回复:] 不懂
串口通信,数据是一个字节一个字节发送的,接收端接收的时候,任意时间去接收,你只能收到串口缓冲区里有的数据,而收不到还没有发送的数据 TCP是要么能收到完整的包,要么就什么都收不到,会等待包完整到达 而串口根本不存在包的概念[/quote] comm.Read(buf, 0, n);这个没有办法完全一次性读到串口缓冲区的n个字节吗,如何循环啊[/quote] 你理解有误 不是不能一次性读取缓冲区 而是缓冲区里不是一开始就有全部的数据 数据是一个字节一个字节发送到缓冲区里的 如何循环,要看你现在是用什么方式做的 如果现在是同步的方式,那么设置个读取超时时间,然后while循环去取,超时跳出循环 如果是串口接收回调事件,可以设置收到70字节才引发回调事件,或者回调事件里做拼接,然后判断如果已经收到足够70字节就开始处理
sinat_22115895 2014-10-30
  • 打赏
  • 举报
回复
引用 10 楼 Z65443344 的回复:
[quote=引用 7 楼 sinat_22115895 的回复:] 不懂
串口通信,数据是一个字节一个字节发送的,接收端接收的时候,任意时间去接收,你只能收到串口缓冲区里有的数据,而收不到还没有发送的数据 TCP是要么能收到完整的包,要么就什么都收不到,会等待包完整到达 而串口根本不存在包的概念[/quote] comm.Read(buf, 0, n);这个没有办法完全一次性读到串口缓冲区的n个字节吗,如何循环啊
於黾 2014-10-30
  • 打赏
  • 举报
回复
引用 7 楼 sinat_22115895 的回复:
不懂
串口通信,数据是一个字节一个字节发送的,接收端接收的时候,任意时间去接收,你只能收到串口缓冲区里有的数据,而收不到还没有发送的数据 TCP是要么能收到完整的包,要么就什么都收不到,会等待包完整到达 而串口根本不存在包的概念
  • 打赏
  • 举报
回复
嗯,串行口是一个字节一个字节缓慢收发的。你想收到70字节,应该自己去保证。
wind_cloud2011 2014-10-30
  • 打赏
  • 举报
回复
你先判断长度,再截取,先不要入库,再每次读取的列出来看一下,既然是报substring的错,就在这找找原因
sinat_22115895 2014-10-30
  • 打赏
  • 举报
回复
不懂
於黾 2014-10-30
  • 打赏
  • 举报
回复
串口通信,根本不存在"包"的概念 你不要老拿TCP通信的眼光来做串口通信
sinat_22115895 2014-10-30
  • 打赏
  • 举报
回复
截取的位置是对的,我已经用串口助手试过了,也把数据插入到数据库了。
引用 3 楼 wind_cloud2011 的回复:
你截取的位置可能不对,
於黾 2014-10-30
  • 打赏
  • 举报
回复
串口助手也是分多次收到,再拼接一起,给你显示的 你以为它能一次性就读全了吗
wind_cloud2011 2014-10-30
  • 打赏
  • 举报
回复
你截取的位置可能不对,
sinat_22115895 2014-10-30
  • 打赏
  • 举报
回复
我用串口助手发送数据(自己在Text中输入的数据)读数据再插入数据库没问题的,但是用了单片机插入电脑数据就都不完整,明显 串口read读取数据不完整,没办法达到70字节啊(我一个包70个字节),怎么办呢。
於黾 2014-10-30
  • 打赏
  • 举报
回复
你不要指望从串口读数据能读一次就全部读到 分多次读,读完拼接

110,546

社区成员

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

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

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