请教高手serialport十六进制显示的问题

sxkjdxllw0406 2012-08-07 09:05:54
我的PC和另一台PC进行通讯。本机始终是十六进制显示。

对方的机子先使用非十六进制发送文本:01 03 00 56 00 01 64 1A,本机显示正常:3031 3033 3030 3536 3030 3031 3634 3141;

对方的机子再使用十六进制发送同样文本,本机却显示:1305601641a,这是怎么回事?

本机的十六进制显示使用的都是同一个函数,如下:

//首先是控件serialport的方法:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
byte[] buffer = new byte[this.serialPort1.BytesToRead];
//if (this.serialPort1.BytesToRead >= 0)
//{
this.serialPort1.Read(buffer, 0, buffer.Length);

if (this.checkBox2.Checked)//按十六进制显示
{
string txt = chshex.hextostr(buffer);//调用chshex函数,具体见下面
print(txt);
receive = txt.Length+ receive;
this.toolStripStatusLabel4.Text = receive.ToString();
}
if (!this.checkBox2.Checked)//不按十六进制显示
{

string txt = ConvertByteArrayToString(buffer);
print(txt);
receive = txt.Length * 2 + receive;
this.toolStripStatusLabel4.Text = receive.ToString();
}
//}
}
catch (Exception exp)
{
MessageBox.Show(exp.ToString());
}
}

//chshex的hextostr函数:

public static string hextostr(byte[] date)
{
string a = "";
for (int i = 0; i < date.Length; i++)
{
a = a+Convert.ToString(date[i],16);

}
return a;

}

这个函数调用我觉得是有问题的。只有在对方为非十六进制发送时才显示正确。而对方以十六进制发送则显示错误。

大家给帮帮忙看看问题在哪儿?
...全文
293 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfqsy 2012-08-10
  • 打赏
  • 举报
回复
485转232,0:X2是转换成大写16进制,x2是小写,这个只是ASCII和字符的表示方法而已
sxkjdxllw0406 2012-08-10
  • 打赏
  • 举报
回复
按照你的程序修改后显示正常了。不过还有一个问题。
我的这个控件方法[serialport_DataReceived()]只有在与RS232通讯时才会显示正常,当与RS485通讯时根本没有显示。我觉得是在接收上出了问题。用了其他的串口通讯软件,都可以与RS485正常通讯。我这个程序里还缺些什么才能与RS485通讯?
[Quote=引用 12 楼 的回复:]

注意。我上面的写法(String.Format("{0:X2} ", RData)中的RData是末尾带一个空格的。你如果不需要自带空格,就
(String.Format("{0:X2}", RData)
[/Quote]
知擎物联 2012-08-08
  • 打赏
  • 举报
回复
注意。我上面的写法(String.Format("{0:X2} ", RData)中的RData是末尾带一个空格的。你如果不需要自带空格,就
(String.Format("{0:X2}", RData)
知擎物联 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

怎样让将16进制转换成的字符串输出到文本框中?是否将Rdata的值赋给一个string变量,然后在textbox.text中显示出来?引用 7 楼 的回复:

引用 6 楼 的回复:

能具体讲一下,这有什么作用么?谢谢!!引用 5 楼 的回复:

StringBuilder Cmd = new StringBuilder();
foreach (byte RData in ……
[/Quote]
没错。你试了就明白了。
lovewanxin 2012-08-08
  • 打赏
  • 举报
回复 1
if (16进制)
{
SetLBItems(rtbRecive, PublicMethod.ByteToString(arrBtyeInfo)); }
else
{
SetLBItems(rtbRecive, System.Text.Encoding.Default.GetString(arrBtyeInfo, 0, arrBtyeInfo.Length));
}



public static string ByteToString(byte[] data)
{
StringBuilder sb = new StringBuilder();
int length = data.Length > 100 ? 100 : data.Length;

for(int i = 0; i < data.Length; i++)
{
sb.Append(string.Format(" {0}", data[i].ToString("X2")));
}

return sb.ToString();
}
sxkjdxllw0406 2012-08-08
  • 打赏
  • 举报
回复
怎样让将16进制转换成的字符串输出到文本框中?是否将Rdata的值赋给一个string变量,然后在textbox.text中显示出来?[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

能具体讲一下,这有什么作用么?谢谢!!引用 5 楼 的回复:

StringBuilder Cmd = new StringBuilder();
foreach (byte RData in buffer )
{
Cmd.Append(String.Format("{0:X2} ", RData));
}

就是将16进制数转换成字符串的形式输出……
[/Quote]
知擎物联 2012-08-08
  • 打赏
  • 举报
回复
比如byte数组
byte[] buffer =new byte[2];
buffer[0]=0x2F;
buffer[1]=0xEF;

StringBuilder Cmd = new StringBuilder();
foreach (byte RData in buffer )
{
Cmd.Append(String.Format("{0:X2} ", RData));
}

打印Cmd.ToString(),则输出文本: 2F EF
知擎物联 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

能具体讲一下,这有什么作用么?谢谢!!引用 5 楼 的回复:

StringBuilder Cmd = new StringBuilder();
foreach (byte RData in buffer )
{
Cmd.Append(String.Format("{0:X2} ", RData));
}
[/Quote]
就是将16进制数转换成字符串的形式输出。
sxkjdxllw0406 2012-08-08
  • 打赏
  • 举报
回复
能具体讲一下,这有什么作用么?谢谢!![Quote=引用 5 楼 的回复:]

StringBuilder Cmd = new StringBuilder();
foreach (byte RData in buffer )
{
Cmd.Append(String.Format("{0:X2} ", RData));
}
[/Quote]
sxkjdxllw0406 2012-08-08
  • 打赏
  • 举报
回复
噢,好的,谢谢。我先试试[Quote=引用 12 楼 的回复:]

注意。我上面的写法(String.Format("{0:X2} ", RData)中的RData是末尾带一个空格的。你如果不需要自带空格,就
(String.Format("{0:X2}", RData)
[/Quote]
sxkjdxllw0406 2012-08-07
  • 打赏
  • 举报
回复
怎么回事啊,没人会么:?
sxkjdxllw0406 2012-08-07
  • 打赏
  • 举报
回复
怎么没人关注,请教!!!
知擎物联 2012-08-07
  • 打赏
  • 举报
回复
StringBuilder Cmd = new StringBuilder();
foreach (byte RData in buffer )
{
Cmd.Append(String.Format("{0:X2} ", RData));
}
知擎物联 2012-08-07
  • 打赏
  • 举报
回复
System.Text.Encoding.Default.GetString(data);

110,538

社区成员

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

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

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