求助 串口程序的 “十六进制发送”怎么写

KyKiske22 2014-12-08 11:25:17
我用ASCII骂发送写的是:
serialPort1.Write(txtSendData.Text);
count_s = count_s + txtSendData.Text.Length;
SendLabel.Text = count_s.ToString();
label9.Text = "发送数据成功";
label9.ForeColor = Color.Blue;

十六进制接收方法我写的是
{
StringBuilder b=new StringBuilder();
int n=serialPort1.BytesToRead;
Byte[] bytes=new Bytes[n];
serialPort1.Read(bytes,0,n);
foreach(byte o in bytes)
{
b.Append(o.ToString("X2")+" ");
}
txtReceiveData.AppendText(builder.ToString());
R_Label.Text = (count_r + n).ToString();//记录字节数
}

十六进制发送的写法怎么都不会了 求帮助~
...全文
445 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
KyKiske22 2014-12-10
  • 打赏
  • 举报
回复
引用 28 楼 leafmao 的回复:
硬要按照十六进制发送,用写字节的方法,用这个重载SerialPort.Write(Byte[],Int32,Int32) 举个栗子:

byte [] buff={0,1,2,3,4};
serialPort.Write(buff,0,5);//serialPort为你的串口实例,0是起始索引,5是要发送的字节数
好的我试试 之前和你写的一样 就是多了个遍历过程
於黾 2014-12-09
  • 打赏
  • 举报
回复
你应该有这样的概念: 看到的东西和看不到的东西(文本框里的字符串和后台的byte数组)相互转换 以不同的方式转换,则看到的东西一样,但是转换成的byte[]是不一样的 而不是把看到的东西让它变成不一样了
於黾 2014-12-09
  • 打赏
  • 举报
回复
思路有问题 不是把文本框的内容变成16进制,而是文本框字符串在发送的时候转成16进制 接收也一样,是接收到的byte数组以什么显示,而不是把文本框里面的东西来回转换
KyKiske22 2014-12-09
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
如果发送string直接用 byte[] b = System.Text.Encoding.Encoder.某种编码.GetBytes(你的文本)
我写ASCII发送就是这么写的,但16进制不知道怎么写呢。麻烦写具体点把~
KyKiske22 2014-12-09
  • 打赏
  • 举报
回复
我之前是这么写16进制发送的; int n = txtSendData.TextLength; Byte[] bytes = new Byte[n]; foreach (byte o in bytes) { builder.Append(o.ToString("X2")); } 结果接收框不显示数据,label显示字节没问题
KyKiske22 2014-12-09
  • 打赏
  • 举报
回复
引用 11 楼 Z65443344 的回复:

string str1 = "给予";
byte[] bt = System.Text.Encoding.UTF8.GetBytes(str1);
string str2 = System.Text.Encoding.UTF8.GetString(bt);
用上面方法实现string和byte[]的转换 然后发送的时候要发送byte[],接收也接收byte[]
不管用 还是不显示 干脆建立个单选框 点击时发送文本框的内容会转为16进制,取消单选框会返回原来的。这时候又有问题了,取消单选框时取消不会来原来的数据了。
KyKiske22 2014-12-09
  • 打赏
  • 举报
回复
引用 13 楼 diaodiaop 的回复:
我知道你一定是这个意思.. 如果不点击"十六进制发送" 那么就把aa-bb-cc-dd-ee-ff当作字符串转换成byte[] 发送过去 可能是17个字节. 如果点击了"十六进制发送" 那么实际上就是6个字节.分别是aa,bb,cc,dd,ee,ff 也就是170,187,204,221,238,255是吧
差不多是这个意思
KyKiske22 2014-12-09
  • 打赏
  • 举报
回复
引用 15 楼 mjp1234airen4385 的回复:
既然能发送成功,也能接受成功,那就好了,为什么要执着非要16进制发送呢? 如果你是要显示给用户看的话,那在界面上显示成16进制就好了。 对于串口来说,你发送10进制还是16进制,这都不影响,反正最后会转换成byte数组了。
确实是,但怎么引用啊。我点击了"十六进制发送“后 确实转为16进制了,然后取消选择框就回不去了
阿达King哥 2014-12-09
  • 打赏
  • 举报
回复
ToString()好像重载了一个方法专门是转换成16进制的,你查一下,我不太记得了。
mjp1234airen4385 2014-12-09
  • 打赏
  • 举报
回复
如果你转化成16进制的字符串再发送的话,那串口接收的到就是16进制的那几个字符,而不是你原本的数据了。
mjp1234airen4385 2014-12-09
  • 打赏
  • 举报
回复
既然能发送成功,也能接受成功,那就好了,为什么要执着非要16进制发送呢? 如果你是要显示给用户看的话,那在界面上显示成16进制就好了。 对于串口来说,你发送10进制还是16进制,这都不影响,反正最后会转换成byte数组了。
那城 2014-12-09
  • 打赏
  • 举报
回复
发送怎么写,接收要匹配
by_封爱 版主 2014-12-09
  • 打赏
  • 举报
回复
我知道你一定是这个意思.. 如果不点击"十六进制发送" 那么就把aa-bb-cc-dd-ee-ff当作字符串转换成byte[] 发送过去 可能是17个字节. 如果点击了"十六进制发送" 那么实际上就是6个字节.分别是aa,bb,cc,dd,ee,ff 也就是170,187,204,221,238,255是吧
by_封爱 版主 2014-12-09
  • 打赏
  • 举报
回复

string a="aa-bb-cc-dd-ee-ff";
byte [] b=a.Split('-').AsParallel().Select(x => Convert.ToByte(x, 16)).ToArray();
於黾 2014-12-09
  • 打赏
  • 举报
回复

string str1 = "给予";
byte[] bt = System.Text.Encoding.UTF8.GetBytes(str1);
string str2 = System.Text.Encoding.UTF8.GetString(bt);
用上面方法实现string和byte[]的转换 然后发送的时候要发送byte[],接收也接收byte[]
於黾 2014-12-09
  • 打赏
  • 举报
回复
1.你发送的是字符串,不是byte数组,会调用内部方法转成byte数组,但是你不知道是按什么编码转的,所以最好不要这样用 2.发送编码和接收编码要一致
窗台种西瓜 2014-12-09
  • 打赏
  • 举报
回复
写过一个ModBus的: string SendString = "010300000002C40B"; //需要发送的十六进制字符,2位表示一个十六进制字符,如01、03 byte[] senddata = HexStringToByte(SendString); SerialPort.Write(senddata, 0, senddata.Length); //0表示从senddate的第一个开始发送,长度为senddate的length public byte[] HexString2Byte(string HexString) //十六进制数组转换为byte数组。如data为"03ab6f"。则03按照十六进制为0*16+3 = 3,ab为 10*16+11 = 171,6f为6*16+15=111 { int HexStringLength = HexString.Length; if (HexString.Length % 2 != 0) { HexString += " ";//空格 } byte[] bytes = new byte[HexString.Length / 2]; for (int i = 0; i < bytes.Length; i++) { try { // 每两个字符按照十六进制计算为一个 byte,字符范围为0-9,a-f。 bytes[i] = byte.Parse(HexString.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); } catch { } } return bytes; }
leafmao 2014-12-09
  • 打赏
  • 举报
回复
硬要按照十六进制发送,用写字节的方法,用这个重载SerialPort.Write(Byte[],Int32,Int32) 举个栗子:

byte [] buff={0,1,2,3,4};
serialPort.Write(buff,0,5);//serialPort为你的串口实例,0是起始索引,5是要发送的字节数
KyKiske22 2014-12-09
  • 打赏
  • 举报
回复
上面少了一句话:StringBuilder bs=new StringBuilder( );
KyKiske22 2014-12-09
  • 打赏
  • 举报
回复
if (checkHexSend.Checked) { byte[] bytes = Encoding.ASCII.GetBytes(txtSendData.Text); foreach (byte s in bytes) { bs.Append(s.ToString("X2")); } txtSendData.Text = bs.ToString(); } else { string l=txtSendData.Text; byte[] bytes = new byte[l.Length / 2]; int index = 0; for (int i = 0; i < l.Length; i += 2) { bytes[index] = Convert.ToByte(l.Substring(i, 2), 16); ++index; } string sendData = Encoding.Default.GetString(bytes); txtSendData.Text = sendData; } 这样应该可以满足需求了,具体还在改善 多谢大家指点
加载更多回复(9)

110,545

社区成员

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

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

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