我用C#编写的串口助手能收发字母数字,但是不能接收显示中文,只要是中文就会出现乱码,不知道什么原因,改了接收的编码方式还是不行。求帮忙解决。这是接收显示数据部分的代码。
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 }
用unicode编码转换试下
也还是乱码额
@寻求帮助的编程小白:贴一段完整的报文出来
@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();
}
@寻求帮助的编程小白: 报文,不是代码
@hahanonym:
@寻求帮助的编程小白: 我说16进制的报文
@hahanonym:
肯定乱码三。不要if,你要么就用特殊字符做转义,要么就用16进制转义。然后分bin和text
我在窗体做了选择的,如果不要求显示中文的话,这个if是没问题的,就是没法显示中文
@寻求帮助的编程小白: builder.Append(Encoding.Default.GetString(buffer));
不要这样写;你发送时用特定编码,比如utf8(GetBytes);收完bin后,用utf8 GetString即可;
记住一定要收完一个完整的再 UTF8.GetString。
根本不可能啥子乱码的事,计算机只认01。
@寻求帮助的编程小白:
这是"你"的utf8 16进制描述,我想不需要再解释什么了吧,我前面的回复已经说了方法。这个值你用utf8.getString可以去证明。
builder.Append(Encoding.GetEncoding("GB2312").GetString(buffer));
希望对你有帮助。
这个显示的还是乱码
@寻求帮助的编程小白: 这个不乱才怪。数据发送,与程序的加密解密是一样的。你怎么发送的。就怎么解。另外你发送的时候没有指定是用什么编码发送。收到解得出来才怪。
@寻求帮助的编程小白: 再强调一下,整个完成后在解码。c#的串口事件跟完成是没有任何关系的,所以你需要先处理“通讯包”(比如使用分隔符之类的都可以)。
应该是编码问题 串口传输的都是16进制数字