SerialPort sp1 = new SerialPort();
private void Form1_Load(object sender, EventArgs e) //串口设置
{
sp1.PortName = "COM11"; //端口号
sp1.BaudRate = 9600; //波特率
sp1.DataBits = 8; //数据位
sp1.StopBits = StopBits.One; //停止位
sp1.Parity = Parity.None; //校验位
sp1.Open(); //打开端口
sp1.DataReceived += new SerialDataReceivedEventHandler(port_DateReceived);
}
private void btSendDate_Click(object sender, EventArgs e) //HEX数据发送
{
byte[] data = new byte[1]; //发送数据字符数组,每次发送一个字节的数据
string strs = tbWriteDate.Text.Replace(" ", "").Replace("\r\n",""); //剔除字符串中的空格和回车
//如果字符串的个数为单数,在最后一位前补0
if (strs.Length % 2 == 1)
{
strs = strs.Insert(strs.Length - 1, "0");
}
//将字符串中两个字符组成一个8进制数,循环次数为字符串长度的一半
for (int i = 0; i < strs.Length / 2 ; i++)
{
//将两位字符转换成一位16进制数
data[0] = Convert.ToByte(strs.Substring(i * 2, 2), 16);
//将发送数据字符数组的数据发送
sp1.Write(data, 0, 1);
}
}
byte[] buffer = new byte[256]; //接收串口数据
int dateCount = 0; //串口数据的数量
private void port_DateReceived(object sender, SerialDataReceivedEventArgs e) //HEX数据接收
{
dateCount = sp1.BytesToRead; //读取串口缓冲区的字节个数
sp1.Read(buffer,0,dateCount); //将所有字节读取到字节数组中
this.Invoke(new EventHandler(DisplayText)); //主窗体线程执行DisplayText方法
}
private void DisplayText(object sender, EventArgs e)
{
for (int i = 0; i < dateCount; i++) //将每个字节转换成两位16进制数
{
textBox1.Text += buffer[i].ToString("X2") + " ";
}
textBox1.Text += "\t\n"; //读取完全部数据后换行
}