public static byte[] HexStringToBytes(string hs)
{
string[] strArr = hs.Trim().Split(' ');
byte[] b = new byte[strArr.Length];
//逐个字符变为16进制字节数据
for (int i = 0; i < strArr.Length; i++)
{
b[i] = Convert.ToByte(strArr[i], 16);
}
//按照指定编码将字节数组变为字符串
return b;
}
用上面的代码转换成HEX格式数据,即16进制数据
public void Send_Simple()
{
try
{
if (Hex_Rec.Checked == true)
{
//串口的十六进制发送转换函数
sp.Write( HexStringToBytes(TextBox_Sen.Text), 0, 7);
}
else
{
//简单发送文本数据
sp.WriteLine(TextBox_Sen.Text);
}
}
catch (Exception)
{
MessageBox.Show("发送数据时发生错误!", "错误提示");
return;
}
}
hex_rec为一个checkbox控件。 SerialPort sp = new SerialPort("COM" + (i + 1).ToString());代码内sp为串口
接收hex数据
public void DataReceived_Simple()
{
DateTime dt = DateTime.Now;
if (!Hex_Rec.Checked)
{
//TextBox_Rec.Text += dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
//TextBox_Rec.Text += sp.Read() + "\r\n";
/*
* sp.ReadLine()是线程阻塞的,机器向串口发送数据然后 串口有数据接收时,sp.ReadLine()才会继续向下执行。
* 因为下位机没有发回车换行来,默认是\n结束,相当于执行ReadTo('\n')因为下位机没发\n,所以一直卡在这里等待。
*/
//TextBox_Rec.Text += sp.ReadLine() + "\r\n";
try
{
Byte[] receivedData = new Byte[sp.BytesToRead]; //创建接收字节数组
sp.Read(receivedData, 0, receivedData.Length); //读取数据
TextBox_Rec.Text += new UTF8Encoding().GetString(receivedData) + "\r\n";//用万能的UTF8可以传输中文不会乱码
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, ":出错提示!!!!!");
}
}
else
{
//16进制发送数据还原
int i_InNum;//输入缓冲区中字节数
i_InNum = sp.BytesToRead;
Byte[] ReceivedData = new Byte[sp.BytesToRead];//创建接收字节数组
sp.Read(ReceivedData, 0, ReceivedData.Length);//读取接收的数据
String RecvDataText = null;
for (int i = 0; i < ReceivedData.Length; i++)
{
RecvDataText += (ReceivedData[i].ToString("X2")+" ");
}
TextBox_Rec.Text += RecvDataText + dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
}
//丢弃接收缓冲区数据
sp.DiscardInBuffer();
}
查询多次总算凑齐学会了该项操作(备注一下,百度时用不同的描述搜索同样的事情会有不同的结果)。操作发送hex数据主要是通过串口来向设备发送控制命令,应该具有通用性。