6729|10

44

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于串口通讯ReadLine的问题 [复制链接]

上位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
此帖出自单片机论坛

最新回复

但是用SerialPort.ReadLine()方法,可以连续读取多个字节,没有数据丢失,复制代码 你在ReadLine的时候不是没有丢失吗?  详情 回复 发表于 2015-10-23 13:22
点赞 关注
 

回复
举报

428

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
本帖最后由 newnew0601 于 2015-10-22 12:41 编辑

此帖出自单片机论坛
 
 

回复

9717

帖子

24

TA的资源

版主

板凳
 
readLine是以字符的形式读取,正常只支持char型,你可以尝试使用readByte函数。
还有一搬readLine以0x0d,0x0a为结束符,如果发送的数据中没有换行符有的上位机程序会一直等等换行符出现。
此帖出自单片机论坛

点评

我有发0x0a作为结束符啊  详情 回复 发表于 2015-10-22 13:51
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

44

帖子

0

TA的资源

一粒金砂(中级)

4
 
littleshrimp 发表于 2015-10-22 11:13
readLine是以字符的形式读取,正常只支持char型,你可以尝试使用readByte函数。
还有一搬readLine以0x0d,0 ...

我有发0x0a作为结束符啊
此帖出自单片机论坛

点评

ReadLine只能读取字符,0~127其它数据它会忽略。  详情 回复 发表于 2015-10-22 15:33
 
 
 

回复

9717

帖子

24

TA的资源

版主

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

ReadLine只能读取字符,0~127其它数据它会忽略。
此帖出自单片机论坛

点评

谢谢大侠,明白了,顺便也试了下ReadByte()方法,总觉得用的不是很习惯,每次只能读取一个字节,我有时候要发一串数据上来,然后用事件触发接收,不是很好接收。我还有遇到一个问题,用SerialPort.Read(buffer,off  详情 回复 发表于 2015-10-22 19:28
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

44

帖子

0

TA的资源

一粒金砂(中级)

6
 
littleshrimp 发表于 2015-10-22 15:33
ReadLine只能读取字符,0~127其它数据它会忽略。

谢谢大侠,明白了,顺便也试了下ReadByte()方法,总觉得用的不是很习惯,每次只能读取一个字节,我有时候要发一串数据上来,然后用事件触发接收,不是很好接收。我还有遇到一个问题,用SerialPort.Read(buffer,offSet,int)方法读取的时候,然后把buffer里面接收的数据输出,总是发现数据有缺失,就是Read回来的数据有缺失,这是为什么
此帖出自单片机论坛

点评

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

回复

9717

帖子

24

TA的资源

版主

7
 
wensir 发表于 2015-10-22 19:28
谢谢大侠,明白了,顺便也试了下ReadByte()方法,总觉得用的不是很习惯,每次只能读取一个字节,我有时 ...

你再多试几次吧,正常不会有问题的。
不知道你用什么上语言写上位机程序,一搬在.Read(buffer,offSet,int)的时候应该先获取一下可读取的长度,然后根据长度读取,否则后边会有很多空字节。
此帖出自单片机论坛

点评

主要是用C#吧 byte[] buffer = new byte[SerialPort.BytesToRead]; int s = SerialPort.Read(buffer,0,buffer.Length); str = Encoding.UTF8.GetString(buffer,0,s);  详情 回复 发表于 2015-10-23 12:12
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

44

帖子

0

TA的资源

一粒金砂(中级)

8
 
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,但是不做额外处理,每次只能读取一个字节
此帖出自单片机论坛

点评

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

回复

9717

帖子

24

TA的资源

版主

9
 
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
此帖出自单片机论坛

点评

有试过转换为base64,还试过ASCII,Unicode编码,转后之后接收,都是有数据丢失,用ReadLine读取,倒是没有问题,所以都不敢用Read一次性读取多个字节了,都不知道问题出在哪里。不过就算有数据丢失,在程序内部判断  详情 回复 发表于 2015-10-23 12:29
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

44

帖子

0

TA的资源

一粒金砂(中级)

10
 
littleshrimp 发表于 2015-10-23 12:15
正常情况下一次性读取多个字节不会有问题的
还有一个办法是把数据转换base64然后用readLine读取,再解码 ...

有试过转换为base64,还试过ASCII,Unicode编码,转后之后接收,都是有数据丢失,用ReadLine读取,倒是没有问题,所以都不敢用Read一次性读取多个字节了,都不知道问题出在哪里。不过就算有数据丢失,在程序内部判断,传过来的数据也可以用,但是有数据丢失,肯定不怎么好用就是了,还不如直接用ReadByte,然后处理,至少没有数据丢失,
此帖出自单片机论坛

点评

你在ReadLine的时候不是没有丢失吗?  详情 回复 发表于 2015-10-23 13:22
 
 
 

回复

9717

帖子

24

TA的资源

版主

11
 
wensir 发表于 2015-10-23 12:29
有试过转换为base64,还试过ASCII,Unicode编码,转后之后接收,都是有数据丢失,用ReadLine读取,倒是没 ...
  1. 但是用SerialPort.ReadLine()方法,可以连续读取多个字节,没有数据丢失,
复制代码

你在ReadLine的时候不是没有丢失吗?
此帖出自单片机论坛
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表