C#中的串口连接问题。从SerialPort输入缓冲区中读取出现null错误

我向云台发出一条角度查询的指令。我向串口发送一条指令后,串口会返回一组7位字节的值(包含角度信息),可是我读取的时候会出现错误,显示为nullEXCEPTION.seri... 我向云台发出一条角度查询的指令。
我向串口发送一条指令后,串口会返回一组7位字节的值(包含角度信息),可是我读取的时候会出现错误,显示为nullEXCEPTION.

serialPort.Open();
serialPort.Write(messagesend, 0, 7);
//System.Threading.Thread.Sleep(3000);
serialPort.Read(messagereceive, 5, 2); //显示错误的地方

messagesend,messagereceive在之前都已经定义为byte[].
问题出现在哪里?
展开
 我来答
syht2000
高粉答主

推荐于2017-11-26 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部

没这样用的,一般的用法发送时

serialPort.Write(messagesend, 0, messagesend.Length);

接收时

int n = serialPort.BytesToRead;
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据  
serialPort.Read(buf, 0, n);//读取缓冲数据
追问
看不出来你和我写的有什么区别。。。我确定设备返回来的数据是7位字节的,并且我只需要第五位和第六位的数据。我用的协议是pelcod,发出的指令也是7位字节,所以messagesend,messagereceive在之前已经定义为byte数组。好像方法上和你写的没什么不一样吧。求指教。
追答
设备返回的数据并不一定是你认为的7字节,有时候7字节可能会被拆成两部分,或者跟其它数据粘在一起,所以一般没有写死的,接收数据用的数组也都不能预先定义的,有了上面的buf之后,你可以再继续处理
int n = serialPort.BytesToRead;
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
serialPort.Read(buf, 0, n);//读取缓冲数据
if(n>=7) //用长度判断其实并不好,数据发生中断的时候会引起数据丢失和错位
{
//此时的buf[4]和buf[5]就是你要的,怎么处理看你的需要了
}

注意:实际上如果是发送数据后再接收数据,一般也没有象上面这种发送后立即读出的(因为中间等待的时间未知,很可能你去读数据的时候,数据还没返回),串口的数据接收有专门的事件叫DataReceived,你可以在串口控件的事件中找到它,在它里面就可以写上面的接收过程,要注意的是,这个DataReceived是会自动创建线程的,你接收数据之后如果要访问界面上的控件,就要用委托,类似于
if(n>=7)
{
this.Invoke((EventHandler)(delegate
{
//访问主界面的控件比如textBox1
}
));
}
money0_04c351c2
2014-04-15 · TA获得超过4142个赞
知道大有可为答主
回答量:5505
采纳率:49%
帮助的人:1612万
展开全部
单纯的定义为byte[]是不行的,你得为messagereceive申请好空间。
byte[] messagereceive= new byte[7];
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1d020b4
2016-04-03
知道答主
回答量:1
采纳率:0%
帮助的人:1138
展开全部
不知道,看不懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式