vs 串口接收数据时 如果数据中含有中文 有时出现乱码的 解决
2010-12-02 17:46
435 查看
现象:(以下描述中,用vs 写的程序,简称为程序)
用串口助手给程序发数据,如果数据为全英文,则结果正确,而如果数据中含有英文,则结果有时正确,有时错误。
代码如下
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int iThisLength = serialPort1.BytesToRead;
if (iThisLength > 0)
{
byte[] cpConfig = new byte[iThisLength];
serialPort1.Read(cpConfig, 0, iThisLength);
string sReceiveContent = Encoding.GetEncoding(“GB2312”).GetString(cpConfig);
if (sReceiveContent != "")
{
AllReceive += sReceiveContent ;
}
}
}
以上代码中为了处理串口事件的一个特性(发送端发送了一串数据,但是接收端有可能会分几次触发这个事件,每次都只收一部分) ,因此使用了一个全局字符串AllReceive 。
并且使用了一个timer来判断串口是否收完整了一包数据(这里,我判断数据的完整性依据:如果串口在一定时间内(如200ms)再没有收到任何内容,则认为已经收到了一个完整的包) 。
注意:就是这句导致了乱码的问题
string sReceiveContent = Encoding.GetEncoding(“GB2312”).GetString(cpConfig);
如果串口事件,在一次触发中,数据的最末端正好收到了一个完整的汉字(一个汉字使用2个字节来表示),那么没有问题。
但是如果数据的最末端正好收到了前半个汉字的编码,则经过 Encoding.GetEncoding(“GB2312”).GetString(cpConfig) 之后,就会把汉字补齐,因此就会出现问题。
解决的办法:
不能在此处做编码转换的工作,而应该是在收到完整的一包数据后,再去转换整个完整的包,这样就不会出现问题了。
有的网友提到在接收之前来句System.Threading.Thread.Sleep(1000); 就可以解决问题了,这样是可以解决问题,但是
道理上还是等完整的一包数据都存放到缓冲区后再去触发串口的接收事件,因为经过了1s的延迟,因此串口的接收事件只会触发因此,而不会像我的代码中会触发多次了。
当然,付出的代价就是,延迟了1s的时间,这在很多场合是不可接受的。
用串口助手给程序发数据,如果数据为全英文,则结果正确,而如果数据中含有英文,则结果有时正确,有时错误。
代码如下
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int iThisLength = serialPort1.BytesToRead;
if (iThisLength > 0)
{
byte[] cpConfig = new byte[iThisLength];
serialPort1.Read(cpConfig, 0, iThisLength);
string sReceiveContent = Encoding.GetEncoding(“GB2312”).GetString(cpConfig);
if (sReceiveContent != "")
{
AllReceive += sReceiveContent ;
}
}
}
以上代码中为了处理串口事件的一个特性(发送端发送了一串数据,但是接收端有可能会分几次触发这个事件,每次都只收一部分) ,因此使用了一个全局字符串AllReceive 。
并且使用了一个timer来判断串口是否收完整了一包数据(这里,我判断数据的完整性依据:如果串口在一定时间内(如200ms)再没有收到任何内容,则认为已经收到了一个完整的包) 。
注意:就是这句导致了乱码的问题
string sReceiveContent = Encoding.GetEncoding(“GB2312”).GetString(cpConfig);
如果串口事件,在一次触发中,数据的最末端正好收到了一个完整的汉字(一个汉字使用2个字节来表示),那么没有问题。
但是如果数据的最末端正好收到了前半个汉字的编码,则经过 Encoding.GetEncoding(“GB2312”).GetString(cpConfig) 之后,就会把汉字补齐,因此就会出现问题。
解决的办法:
不能在此处做编码转换的工作,而应该是在收到完整的一包数据后,再去转换整个完整的包,这样就不会出现问题了。
有的网友提到在接收之前来句System.Threading.Thread.Sleep(1000); 就可以解决问题了,这样是可以解决问题,但是
道理上还是等完整的一包数据都存放到缓冲区后再去触发串口的接收事件,因为经过了1s的延迟,因此串口的接收事件只会触发因此,而不会像我的代码中会触发多次了。
当然,付出的代价就是,延迟了1s的时间,这在很多场合是不可接受的。
相关文章推荐
- JSP 表单输入,UTF编码,get方式提交数据出现中文乱码解决方法
- pl/sql查询数据出现中文乱码问题的解决办法
- Gridview往Excel中导入数据出现中文乱码的解决办法
- JSP MySQL插入数据时出现中文乱码问题的解决方法
- Ajax $.ajax() 提交数据出现中文乱码的时候解决方法
- c#接收中文出现乱码问题解决方法2
- JAVA_WEB项目之如何解决Struts2和Spring整合时出现中文数据提交时出现乱码
- SSH项目中向数据库写中文数据时出现乱码解决办法
- 获得URL含有中文出现乱码解决
- DataGrid数据导出excel文件,有时出现乱码解决方法。
- 解决方法:ASP读取数据库中的中文数据出现乱码的问题
- jsp页面包含含有中文的html页面出现乱码的解决方法
- 解决Volley接收数据、中文显示乱码问题。
- js提交表单中包含中文参数值,request请求参数正常,服务器端接收出现乱码解决思路
- php读取mysql中文数据出现乱码的解决方法
- Form提交中文数据时,后台获得出现乱码问题解决。
- springMVC_json格式数据的接收和发送(未解决中文乱码问题)
- MySql中表单输入数据出现中文乱码的解决方法
- 解决SpringMvc后台接收json数据中文乱码问题
- Ajax融合struts2过程中,action类回传给客户端中文数据出现问号乱码的解决办法