首页 新闻 会员 周边

C#编写串口助手不能接收显示中文

0
悬赏园豆:20 [已解决问题] 解决于 2017-03-15 11:12

我用C#编写的串口助手能收发字母数字,但是不能接收显示中文,只要是中文就会出现乱码,不知道什么原因,改了接收的编码方式还是不行。求帮忙解决。这是接收显示数据部分的代码。

 

C#
寻求帮助的编程小白的主页 寻求帮助的编程小白 | 初学一级 | 园豆:36
提问于:2017-01-11 09:41
< >
分享
最佳答案
0
System.Text.Encoding.Default.GetString(buffer);

发送用:

1 System.Text.Encoding.Default.GetBytes(s);

我一般写成静态函数

 1 /// <summary>
 2         /// string 转 byte[]
 3         /// </summary>
 4         /// <param name="s"></param>
 5         /// <returns></returns>
 6         public static byte[] StringToByte(string s)
 7         {
 8             return System.Text.Encoding.Default.GetBytes(s);
 9         }
10         /// <summary>
11         /// Byte[] 转 string
12         /// </summary>
13         /// <param name="b"></param>
14         /// <returns></returns>
15         public static string ByteToString(this byte[] b)
16         {
17             return System.Text.Encoding.Default.GetString(b);
18         }

 

收获园豆:20
小书丶 | 初学一级 |园豆:154 | 2017-01-12 15:03
其他回答(4)
0

用unicode编码转换试下

hahanonym | 园豆:1460 (小虾三级) | 2017-01-11 09:54

也还是乱码额

@寻求帮助的编程小白:贴一段完整的报文出来

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2017-01-11 14:06

@hahanonym: 

接收

private void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (closing)
{
return;
}
try
{
listening = true;//设置标记,表示已经开始处理数据,一会要用系统ui
int n = comm.BytesToRead;//数据接收缓存区的字接数
byte[] buffer = new byte[n];//创建临时字节数组
receiveCount += n;//接收技计数
comm.Read(buffer, 0, n);//从缓存区读取数据
builder.Clear();//清除字符串构造器的内容
//访问ui资源,所以需要使用invoke方式同步ui
this.Invoke((EventHandler)(delegate
{
//判断是否为十六进制
if (chkDataReceivedHexView.Checked)
{
//输出十六进制字符
foreach (byte bt in buffer)
{
builder.Append(bt.ToString("X2") + " ");
}
//builder.Append(Encoding.UTF8.GetString(buffer));
}
else
{
//按ASCII码译码规则输出
//builder.Append(Encoding.ASCII.GetString(buffer));
//builder.Append(Encoding.GetEncoding("GB2312").GetString(buffer));
builder.Append(Encoding.Default.GetString(buffer));
//builder.Append(Encoding.UTF8.GetString(buffer));

}
//添加(Append)到文本框末端,并滚动到最后。
this.txtDataReceivedArea.AppendText(builder.ToString());
//修改ui上的接收计数
labRxCount.Text = receiveCount.ToString();
}));
}
finally
{
listening = false;//我用完了。可以关闭窗口了
}
}

发送

private void NewMethodSendData()
{
//记录发送字节数
int n = 0;
//发送窗口是否为空
if (txtDataSentArea.Text == "")//发送窗口为空
{
return;
}
else
{
//选择十六进制发送
if (chkDataSentByHex.Checked)
{
//用正则得到有效的十六进制数
MatchCollection mc = Regex.Matches(txtDataSentArea.Text, @"(?i)[\da-f]{2}");
List<byte> bufList = new List<byte>();//填充到临时列表中
//依次添加到列表
foreach (Match m in mc)
{
bufList.Add(byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber));
}
//转换列表位数组后,发送
comm.Write(bufList.ToArray(), 0, bufList.Count);
//记录发送的字节数
n = bufList.Count;
}
else//ASCII码直接发送
{
//包含换行符
if (chkDataSentNewline.Checked)
{
comm.WriteLine(txtDataSentArea.Text);
n = txtDataSentArea.Text.Length + 2;
}
else//不包含换行符
{
comm.Write(txtDataSentArea.Text);
n = txtDataSentArea.Text.Length;
}
}
}
sendCount += n;//记录发送字节数
labTxCount.Text = sendCount.ToString();
}

@寻求帮助的编程小白: 报文,不是代码

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2017-01-11 14:22

@hahanonym: 

@寻求帮助的编程小白: 我说16进制的报文

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2017-01-11 16:04

@hahanonym: 

@寻求帮助的编程小白: http://www.mokuge.com/tool/asciito16/

 

你用这个测试下你的报文吧,不对

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2017-01-11 16:58
0

肯定乱码三。不要if,你要么就用特殊字符做转义,要么就用16进制转义。然后分bin和text

花飘水流兮 | 园豆:13560 (专家六级) | 2017-01-11 11:28

我在窗体做了选择的,如果不要求显示中文的话,这个if是没问题的,就是没法显示中文

@寻求帮助的编程小白: builder.Append(Encoding.Default.GetString(buffer));

不要这样写;你发送时用特定编码,比如utf8(GetBytes);收完bin后,用utf8 GetString即可;

记住一定要收完一个完整的再 UTF8.GetString。

根本不可能啥子乱码的事,计算机只认01。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2017-01-11 18:23

@寻求帮助的编程小白: 

这是"你"的utf8 16进制描述,我想不需要再解释什么了吧,我前面的回复已经说了方法。这个值你用utf8.getString可以去证明。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2017-01-11 18:40
0

 builder.Append(Encoding.GetEncoding("GB2312").GetString(buffer));

希望对你有帮助。

盟怀部孩 | 园豆:878 (小虾三级) | 2017-01-11 11:37

这个显示的还是乱码

@寻求帮助的编程小白: 这个不乱才怪。数据发送,与程序的加密解密是一样的。你怎么发送的。就怎么解。另外你发送的时候没有指定是用什么编码发送。收到解得出来才怪。

支持(0) 反对(0) 盟怀部孩 | 园豆:878 (小虾三级) | 2017-01-11 17:13

@寻求帮助的编程小白: 再强调一下,整个完成后在解码。c#的串口事件跟完成是没有任何关系的,所以你需要先处理“通讯包”(比如使用分隔符之类的都可以)。 

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2017-01-11 18:30
0

应该是编码问题 串口传输的都是16进制数字

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2017-03-07 14:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册