我使用的是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个字节数据,是不是我前面读的数据被覆盖呢?我搞不明白了,希望大家能帮帮我,高分求解,一定结贴。
但是在我用其与下位机(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个字节数据,是不是我前面读的数据被覆盖呢?我搞不明白了,希望大家能帮帮我,高分求解,一定结贴。
http://hi.baidu.com/iiyouxia/blog/item/fe7d05fbea4796156d22ebb5.html
http://blog.sina.com.cn/s/blog_5443949f0100bk38.html
你的 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;
}
保守一点应该这么写
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 ;
保守一点应该这么写
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 ;