[求助] 关于串口通讯ReadLine的问题

wensir   2015-10-22 10:22 楼主
上位PC机程序      
          buffer = Encoding.UTF8.GetBytes(sp.ReadLine());//读取串口数据
                for (int i = 0; i < buffer.Length; i++)
                {
                    if (buffer[i] == 17)
                    {
                        for (int j = i; j < 4; j++)
                        {
                            this.Invoke(del, buffer[j].ToString());//委托显示
                        }
                    }
                }
以上程序,当我下位机给上位PC发送0-127范围的字节时,buffer[j].ToString()能正确读取数据,当我下位机给上位PC机发送128-256范围字节的时候,buffer[j].ToString()总是返回63,有大神能帮解答下原因吗
下位机发送数据:
SendChar(0x11);//正常
SendChar(0x12);//正常
SendChar(0x7f);//正常
SendChar(0x80);//异常
SendChar(0x90);//异常

SendChar(0x0A);// /n newLine

回复评论 (10)

本帖最后由 newnew0601 于 2015-10-22 12:41 编辑
点赞  2015-10-22 11:09
readLine是以字符的形式读取,正常只支持char型,你可以尝试使用readByte函数。
还有一搬readLine以0x0d,0x0a为结束符,如果发送的数据中没有换行符有的上位机程序会一直等等换行符出现。
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-10-22 11:13
引用: littleshrimp 发表于 2015-10-22 11:13
readLine是以字符的形式读取,正常只支持char型,你可以尝试使用readByte函数。
还有一搬readLine以0x0d,0 ...

我有发0x0a作为结束符啊
点赞  2015-10-22 13:51
引用: wensir 发表于 2015-10-22 13:51
我有发0x0a作为结束符啊

ReadLine只能读取字符,0~127其它数据它会忽略。
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-10-22 15:33
引用: littleshrimp 发表于 2015-10-22 15:33
ReadLine只能读取字符,0~127其它数据它会忽略。

谢谢大侠,明白了,顺便也试了下ReadByte()方法,总觉得用的不是很习惯,每次只能读取一个字节,我有时候要发一串数据上来,然后用事件触发接收,不是很好接收。我还有遇到一个问题,用SerialPort.Read(buffer,offSet,int)方法读取的时候,然后把buffer里面接收的数据输出,总是发现数据有缺失,就是Read回来的数据有缺失,这是为什么
点赞  2015-10-22 19:28
引用: wensir 发表于 2015-10-22 19:28
谢谢大侠,明白了,顺便也试了下ReadByte()方法,总觉得用的不是很习惯,每次只能读取一个字节,我有时 ...

你再多试几次吧,正常不会有问题的。
不知道你用什么上语言写上位机程序,一搬在.Read(buffer,offSet,int)的时候应该先获取一下可读取的长度,然后根据长度读取,否则后边会有很多空字节。
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-10-23 10:37
引用: littleshrimp 发表于 2015-10-23 10:37
你再多试几次吧,正常不会有问题的。
不知道你用什么上语言写上位机程序,一搬在.Read(buffer,offSet,in ...

主要是用C#吧
            byte[] buffer = new byte[SerialPort.BytesToRead];

            int s = SerialPort.Read(buffer,0,buffer.Length);

            str = Encoding.UTF8.GetString(buffer,0,s);
输出str,有时候是完整的,有时候就不完整,有数据丢失,但是用SerialPort.ReadLine()方法,可以连续读取多个字节,没有数据丢失,只是只能0~127,SerialPort.Read()可以连续读取多个字节,输出字节范围0~255,但是有数据丢失(丢失完整一个字节),SerialPort.ReadByte()没有数据丢失,能读取到255,但是不做额外处理,每次只能读取一个字节
点赞  2015-10-23 12:12
引用: wensir 发表于 2015-10-23 12:12
主要是用C#吧
            byte[] buffer = new byte[SerialPort.BytesToRead];

            int s = ...

正常情况下一次性读取多个字节不会有问题的
还有一个办法是把数据转换base64然后用readLine读取,再解码
https://bbs.eeworld.com.cn/thread-447800-1-1.html
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-10-23 12:15
引用: littleshrimp 发表于 2015-10-23 12:15
正常情况下一次性读取多个字节不会有问题的
还有一个办法是把数据转换base64然后用readLine读取,再解码 ...

有试过转换为base64,还试过ASCII,Unicode编码,转后之后接收,都是有数据丢失,用ReadLine读取,倒是没有问题,所以都不敢用Read一次性读取多个字节了,都不知道问题出在哪里。不过就算有数据丢失,在程序内部判断,传过来的数据也可以用,但是有数据丢失,肯定不怎么好用就是了,还不如直接用ReadByte,然后处理,至少没有数据丢失,
点赞  2015-10-23 12:29
引用: wensir 发表于 2015-10-23 12:29
有试过转换为base64,还试过ASCII,Unicode编码,转后之后接收,都是有数据丢失,用ReadLine读取,倒是没 ...
  1. 但是用SerialPort.ReadLine()方法,可以连续读取多个字节,没有数据丢失,

你在ReadLine的时候不是没有丢失吗?
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-10-23 13:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复