我用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();//记录字节数
}
十六进制发送的写法怎么都不会了 求帮助~
------解决思路----------------------
写过一个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;
}
------解决思路----------------------
既然能发送成功,也能接受成功,那就好了,为什么要执着非要16进制发送呢?
如果你是要显示给用户看的话,那在界面上显示成16进制就好了。
对于串口来说,你发送10进制还是16进制,这都不影响,反正最后会转换成byte数组了。
------解决思路----------------------
思路有问题
不是把文本框的内容变成16进制,而是文本框字符串在发送的时候转成16进制
接收也一样,是接收到的byte数组以什么显示,而不是把文本框里面的东西来回转换
------解决思路----------------------
硬要按照十六进制发送,用写字节的方法,用这个重载SerialPort.Write(Byte[],Int32,Int32)
举个栗子:
byte [] buff={0,1,2,3,4};
serialPort.Write(buff,0,5);//serialPort为你的串口实例,0是起始索引,5是要发送的字节数