陆陆续续尝试了很多代码,不是接收不到数据就是数据有问题,这次终于可以了。 一般的串口调试工具有两种模式。一种十六进制,一种就是文本,可以按照两种模式进行发送和接收。 //十六进制转换字节数组 private byte[] HexStringToByteArray(string s) { s = s.Replace(" ", ""); byte[] buffer = new byte[s.Length / 2]; for (int i = 0; i < s.Length; i += 2) buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); return buffer; } //字节数组转换十六进制 private string ByteArrayToHexString(byte[] data) { StringBuilder sb = new StringBuilder(data.Length * 3); foreach (byte b in data) sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' ')); return sb.ToString().ToUpper(); } private void getData(string msg) { txtReceive.Invoke(new EventHandler(delegate { txtReceive.AppendText(msg); })); } private void getByteData(byte[] bb) { lboxMsg.Invoke(new EventHandler(delegate { string s = ""; for (int i = 0; i < bb.Length; i++) { s += bb[i].ToString() + " "; } lboxMsg.Items.Add(s); })); } private void btnSend_Click(object sender, EventArgs e) { try { if (IsHex) { //将十六进制数据转换为字节数组 byte[] data = this.HexStringToByteArray(txtSend.Text); mySerialPort.Write(data, 0, data.Length); } else { mySerialPort.Write(txtSend.Text.Trim()); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (IsHex) { System.Threading.Thread.Sleep(300); // 获取字节长度 int bytes = mySerialPort.BytesToRead; // 创建字节数组 byte[] buffer = new byte[bytes]; // 读取缓冲区的数据到数组 mySerialPort.Read(buffer, 0, bytes); this.getData(this.ByteArrayToHexString(buffer) + "\r\n"); this.getByteData(buffer); } else { System.Threading.Thread.Sleep(300); string data = mySerialPort.ReadExisting(); this.getData(data + "\r\n"); } } private void rbtnHex_CheckedChanged(object sender, EventArgs e) { IsHex = rbtnHex.Checked; } private void rbtnTxt_CheckedChanged(object sender, EventArgs e) { IsHex = !rbtnTxt.Checked; } |
|