2019-07-05 6、回顾串口及串口编程
一、回顾串口
1.1 物联网的应用系统与其他设备的通信方式:
1)串行通信(RS-232[30m]、RS-485[1200m]、USB转串口)
2)网络通信(Socket,典型特征IP地址+端口)等
1.2 串行通信
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。
串行通信的特点:传输线少,长距离传送时成本低,但数据的传送控制比并行通信复杂。
1.3并行通信
并行通信通常是将数据字节的各位用多条数据线同时进行传送 。
并行通信特点:控制简单、传输速度快;但传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。
1.4串行通信的传输方向
1、单工:指数据传输仅能沿一个方向,不能实现反向传输。比如遥控器。
2、半双工:指数据传输可以沿两个方向,但需要分时进行。比如对讲机,RS485。
3、全双工:指数据可以同时进行双向传输。比如电话,RS232。
串行通信的传输方向.png
1.5串口通信的通信参数
波特率、数据位、停止位和奇偶校验位。对于两个进行通信的端口,这些参数必须匹配。
1.波特率:表示每秒钟传送的符号(0或1)的个数,单位是bit/s。
波特率为9600表示每秒钟发送9600个符号,发送每个符号的时间为1/9600秒。理论上每秒可以传输9200/8个英文字母的数据量,也就是1200个字节,大约1.2KB。
2.起始位:起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。
3.数据位:数据位一般为8位一个字节的数据(也有5位、6位、7位的情况)。
4.停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。
5.奇偶校验位:让原有数据序列中(包括你要加上的一位)1的个数为奇数或偶数。
1.6串口通信的通信协议
即串口连接标准,有RS-232、RS-422、RS-485。
二、串口编程
2.1工具准备
串口模拟工具、串口调试工具、VS2012
2.2模拟串口运行
1)串口模拟工具及串口调试工具下载
串口模拟工具下载
添加两个端口:COM1、COM2
串口模拟工具.jpg
串口调试工具下载
串口调试工具.jpg
串口调试工具运行
串口调试工具界面.jpg
2)调试运行
打开两个串口调试工具,端口设置分别为之前添加的COM1和COM3口,注意波特率、数据位、停止位、校验位设置成一致的,在COM1端发送数据123,可看到在COM2端接收到数据123
3、通过写代码,在VS2012中接收发送端口数据
3.1界面设计
端口界面设计.jpg3.2关键代码
自动获取串口列表
private void ServiceForm_Load(object sender, EventArgs e)
{
//在下拉列表中列出本机所有串口
//1.定义一个字符串数组,并将获取到的电脑上串口名字赋值给它。
string[] AllPort = SerialPort.GetPortNames();
//2.将一个组合框的内容清除
comboBoxCOMList.Items.Clear();
//3.将数组中的值添加到组合框中
for (int i = 0; i < AllPort.Length; i++)
{
comboBoxCOMList.Items.Add(AllPort[i]);
}
}
打开关闭串口
private void buttonOpenCOM_Click(object sender, EventArgs e)
{
// 串口已打开,此时需要关闭
if (serialPort1.IsOpen)
{
serialPort1.Close();
this.toolStripStatusLabel1.Text = "已关闭串口" + serialPort1.PortName.ToString();
buttonOpenCOM.Text = "打开";
return;
}
// 否则打开串口
else
{
serialPort1.PortName = comboBoxCOMList.Text;
// 初始化串口参数
serialPort1.BaudRate = 115200;
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;
serialPort1.Parity = Parity.None;
try
{
serialPort1.Open();
this.toolStripStatusLabel1.Text = "已打开串口" + serialPort1.PortName.ToString();
buttonOpenCOM.Text = "关闭";
}
catch (Exception ex)
{
this.toolStripStatusLabel1.Text = "打开串口失败,原因:" + ex.Message;
return;
}
}
}
发送数据
private void bt_Send_Click(object sender, EventArgs e)
{
try
{
Control.CheckForIllegalCrossThreadCalls = false;
// 将`待发送数据`发送出去
String setcont = this.tbWrite.Text.ToString();
this.serialPort1.Write(setcont);
}
catch (Exception exp)
{
MessageBox.Show(exp.ToString());
}
}
接收数据
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
//接收数据,并在`接收数据`区域显示出来
tbRead.Text = this.serialPort1.ReadExisting();
}
catch (Exception exp)
{
MessageBox.Show(exp.ToString());
}
}
清空接收区的数据
private void bt_Clear_Click(object sender, EventArgs e)
{
//清空接收区域
this.tbRead.Clear();
}
关闭窗口时,串口仍然为打开状态,则需要关闭串口
if (serialPort1.IsOpen)
{
serialPort1.Close();
}