一.一些基本的语句
1.1 将整数转化为字符串
str = i.Tostring("x").ToUpper( );//i为整形,str为字符串,括号里的"x"代表将i转化为16进制,ToUpper()代表转化为大写
举例:i= 255--转化为16进制的字符串0xff--转化为大写0XFF
1.2 将字符串转化为byte,byte相当于单片机中的unsigned char
byte[ ] buffer = new byte[1];//定义一个只含一个元素的数组buffer
buffer = Convert.ToByte(str,16);//将字符串转化为16进制型的Byte
举例:str = "ab",那buffer就等于0xab
1.3 从一个长的字符串里取出一段字符串
str2 = str1.Substring(2,2);//从str1的第3个字符开始取两个字符
举例:str1 = "0X19",str2就等于"19"
二.串口编程准备
![](https://i-blog.csdnimg.cn/direct/c06d4a2d4587456f988504f762b04f3e.png)
界面
2.1 新建两个下拉列表框,用以选择端口号和波特率
1.string[] baudrate =
new
string[8] {
"1200",
"2400",
"4800",
"9600",
"19200",
"38400",
"57600",
"115200" };
2.comboBox_Baudrate.Items.AddRange(baudrate);
//在波特率的下拉列表框中填入可选的波特率
3.comboBox_Baudrate.SelectedIndex = 3;
//复选框选择第4个,9600
4.comboBox_Number.Items.AddRange(System.IO.Ports.
SerialPort.GetPortNames());
//获取所有可用COM口5.comboBox_Number.SelectedIndex = 0;
//选择下拉框第一个端口
三.打开串口按钮操作
serialPort1.BaudRate =
Convert.ToInt32(comboBox_Baudrate.Text);
serialPort1.PortName = comboBox_Number.Text;
serialPort1.Open();
设置波特率以及串口号以后,打开串口
四.串口发送程序
byte[] buffer = new byte[1];
if (serialPort1.IsOpen)
{
if (true == radioButton2.Checked)//字符单选框选中
{
serialPort1.WriteLine(textBox_Send.Text);//发送文本框中一行字符
}
else
{
for (i = 0; i < textBox_Send.TextLength/2; i++)
{
buffer[0] = Convert.ToByte(textBox_Send.Text.Substring(i*2, 2), 16);
//每2个数值化为一个16进制数发送
serialPort1.Write(buffer, 0, 1);
}
if (0 != textBox_Send.TextLength % 2)
{
buffer[0] = Convert.ToByte(textBox_Send.Text.Substring(
textBox_Send.TextLength- 1,1), 16);
serialPort1.Write(buffer, 0, 1);//发送一个字节
}
}
五.串口接收函数
int num = serialPort1.BytesToRead;//读取串口接收缓冲区字节数
byte[] buffer = new byte[num];
if (true == radioButton4.Checked)
{
//因为访问textBox_Receive文本框,需要访问UI,所以采用委托
Invoke((EventHandler)(delegate
{textBox_Receive.AppendText(serialPort1.ReadExisting());}
);
}
else
{
serialPort1.Read(buffer, 0, num);
foreach (byte b in buffer)
{
Invoke((EventHandler)(delegate
{
textBox_Receive.AppendText("0X"+b.ToString("X2")+" ");
}
)
);
}
}
六.说明
6.1获取串口接收区接收到数据个数:
serialPort1.BytesToRead
6.2如何防止在一个控件的响应事件中调用控件时,线程报警
方法一.使用委托:委托函数格式:Invoke(
(EventHandler)(delegate){函数内容});
方法二.在窗体初始化时加一句话:
![](https://i-blog.csdnimg.cn/direct/69234a10519c4b49a417d2d60a00d4eb.png)
6.3串口接收中断不是实时的,所以可能不是接收一个字节就进入一次接收函数