c# 串口通信问题,高分求解

kingso1217 2009-04-24 08:08:04
我使用的是serialport类写的一个串口通信程序,在本机上使用虚拟串口,通信正常,接收都正确。
但是在我用其与下位机(DSP)进行通信的时候,发现接收的总是最后5个字符,不知道为什么,下位机一共向PC机发送1000多个字节,最后以"*****"结束。循环按字节进行发送,一次发送一个字节。但是我在PC机上接收的时候,发现问题了,当datareceiverd事件触发时,我使用messageBox.show(serialport.databyread)操作,发现对话框只出现一次,而且显示的是5,我就很纳闷为什么会这样?
我的接受代码是这样的,不在实验室啊,源码不能copy,只能手写了。
void datareceivered(....)
{
string rs="";
int k = serialPort1.byteToRead;
byte data ;
//messagebox.show(serialport1.bytetoread);
try{
data = serialport1.read(data,0,k);
rs += Encoding.ASCII.GetString(data);
}
catch(Exception ex)
{
messagebox.show(ex.message);
}
//然后是异步处理显示在textbox中 textbox.text += rs;
}
我郁闷,每次都是只能接受最后的5个字符,也就是“*****”。
希望大家做过这方面东西的,能帮我解释一下,在本机上使用虚拟串口,用串口调试精灵和自己通信,一切正常。
是不是我程序哪里有问题呢?DSP发送的数据2个电机的速度+‘#’。比如 电机1速度 电机2速度 #,一次类推,速度都是2个字节,#是1个字节。最后以5个‘*’作为结束符。再数据传输过程中,是怎么回事呢?怎么每次只能读5个字节的数据,而且是最后5个字节数据,是不是我前面读的数据被覆盖呢?我搞不明白了,希望大家能帮帮我,高分求解,一定结贴。
...全文
174 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanasdf789 2012-09-19
  • 打赏
  • 举报
回复
串口是接收先放到缓存区里面 ,你要自己拼接
zqg282504061 2012-09-19
  • 打赏
  • 举报
回复
串口接收数据不是一次性接收完。你用个字符串“str+=你定义接收数据包的变量“,一直接收到你的帧尾,就停止!这是再把str显示出来就不是5位数了。比如:你的通信协议是01开头,02结尾,那每次就从01开始接收,接收到02就停止。
rong508 2012-09-19
  • 打赏
  • 举报
回复
在读取前加延时,然后 readexisting一次性读取,就可以不用设全局变量了
xufzu123 2009-04-25
  • 打赏
  • 举报
回复
是不是缓冲区设的太小了~~
qzw4549689 2009-04-25
  • 打赏
  • 举报
回复
帮顶
注册失败 2009-04-25
  • 打赏
  • 举报
回复
用串口调试精灵和自己通信,一切正常。

你用调试精灵跟DSP通信正常么?

是不是波特率设置的问题呢。。。
walkghost 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pzlin 的回复:]


看着上面的函数。。 我指出错误的地方。。
你的 rs每次进来清空成  string rs="";
你进去的时候变成rs += Encoding.ASCII.GetString(data);
但是因为事件datareceiverd 会触发多次。。 所以最后进去的时候 rs还是会清空 ,
然后才会rs += Encoding.ASCII.GetString(data)(最后一次的值)

你应该在外面建立一个全局变量 加入rs的数据 ,应该这么写

string receiveData;
void datareceivered(....)
{
string rs…
[/Quote]
UP,建议用全局变量,读到包尾的时候把全局变量再清空。
pzlin 2009-04-25
  • 打赏
  • 举报
回复
不好意思上面搞错。。虽然说最后结果没有什么错的
保守一点应该这么写
string receiveData="";
void datareceivered(....)
{
string rs="";
int k = serialPort1.byteToRead;
byte data ;
//messagebox.show(serialport1.bytetoread);
try{
data = serialport1.read(data,0,k);
rs+= Encoding.ASCII.GetString(data);
receiveData += rs;

}
catch(Exception ex)
{
messagebox.show(ex.message);
}
//然后是异步处理显示在textbox中 textbox.text += rs;
}

直接点就这么写
string receiveData="";
void datareceivered(....)
{
int k = serialPort1.byteToRead;
byte data ;
//messagebox.show(serialport1.bytetoread);
try{
data = serialport1.read(data,0,k);
receiveData += Encoding.ASCII.GetString(data);;

}
catch(Exception ex)
{
messagebox.show(ex.message);
}
//然后是异步处理显示在textbox中 textbox.text += rs;
}


另外 有一点错误。。。 byte data ; 这个定义是错误的。 应该是 byte[] data ;
pzlin 2009-04-25
  • 打赏
  • 举报
回复
不好意思上面搞错。。虽然说最后结果没有什么错的
保守一点应该这么写
string receiveData="";
void datareceivered(....)
{
string rs="";
int k = serialPort1.byteToRead;
byte data ;
//messagebox.show(serialport1.bytetoread);
try{
data = serialport1.read(data,0,k);
rs+= Encoding.ASCII.GetString(data);
receiveData += rs;

}
catch(Exception ex)
{
messagebox.show(ex.message);
}
//然后是异步处理显示在textbox中 textbox.text += rs;
}

直接点就这么写
string receiveData="";
void datareceivered(....)
{
int k = serialPort1.byteToRead;
byte data ;
//messagebox.show(serialport1.bytetoread);
try{
data = serialport1.read(data,0,k);
receiveData += Encoding.ASCII.GetString(data);;

}
catch(Exception ex)
{
messagebox.show(ex.message);
}
//然后是异步处理显示在textbox中 textbox.text += rs;
}


另外 有一点错误。。。 byte data ; 这个定义是错误的。 应该是 byte[] data ;
pzlin 2009-04-25
  • 打赏
  • 举报
回复


看着上面的函数。。 我指出错误的地方。。
你的 rs每次进来清空成 string rs="";
你进去的时候变成rs += Encoding.ASCII.GetString(data);
但是因为事件datareceiverd 会触发多次。。 所以最后进去的时候 rs还是会清空 ,
然后才会rs += Encoding.ASCII.GetString(data)(最后一次的值)

你应该在外面建立一个全局变量 加入rs的数据 ,应该这么写

string receiveData;
void datareceivered(....)
{
string rs="";
int k = serialPort1.byteToRead;
byte data ;
//messagebox.show(serialport1.bytetoread);
try{
data = serialport1.read(data,0,k);
receiveData += Encoding.ASCII.GetString(data);
}
catch(Exception ex)
{
messagebox.show(ex.message);
}
//然后是异步处理显示在textbox中 textbox.text += rs;
}
nuaadzy 2009-04-25
  • 打赏
  • 举报
回复
帮顶,我也遇见类似问题,没有解决
红三天 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 colin0613 的回复:]
查一下通信交互发送的数据,是否有符合“结束条件”的字符串!位置在第五个字节附近吧!
[/Quote]

描述的不清晰,应该是你接收到的数据中,多半是提前遇到接收结束条件了,导致后面的数据丢失掉了。
查哈接收到的指令中,有没有符合你通信协议中的指令结束标识。

我只是推测啊,我曾经遇到过类似的问题!
红三天 2009-04-25
  • 打赏
  • 举报
回复
查一下通信交互发送的数据,是否有符合“结束条件”的字符串!位置在第五个字节附近吧!
ltlljt13142 2009-04-25
  • 打赏
  • 举报
回复
up
zzxap 2009-04-25
  • 打赏
  • 举报
回复
http://www.cnblogs.com/tuyile006/archive/2006/09/29/517882.html
http://hi.baidu.com/iiyouxia/blog/item/fe7d05fbea4796156d22ebb5.html
http://blog.sina.com.cn/s/blog_5443949f0100bk38.html
boywangliang 2009-04-25
  • 打赏
  • 举报
回复
帮顶
kingso1217 2009-04-25
  • 打赏
  • 举报
回复
我缓冲区是serialport控件默认的,我看了下,接收缓冲区是4096个字节啊
readfuture 2009-04-25
  • 打赏
  • 举报
回复
没做过,友情帮顶
readfuture 2009-04-25
  • 打赏
  • 举报
回复
这个问题
蓝海D鱼 2009-04-24
  • 打赏
  • 举报
回复
up

110,545

社区成员

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

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

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