一、串口通信简介
1.同步通信和异步通信
同步通信:通信双方使用同一频率的时钟,发送端在发送数据的同时,提供一个时钟信号,并按照一定的约
定(例如:在时钟信号的上升沿,将数据发送出去)发送数据,接收端根据发送端提供的时钟信号,以及大
家的约定,接收数据。发送方要以固定的节奏去发送数据,而接收方要时刻做好接收数据的准备,识别到前
导码(同步字节:12个字节)后马上要开始接收数据了。同步这种方式中因为分组很大,很长一段数据才
会有额外的辅助位负载,所以效率更高,更加适合对速度要求高的传输,当然这种通信对时序的要求也更
高。
异步通信:通信双方可以有各自的时钟,发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止
位的帮助下实现信息同步的。这种传输通常是很小的分组,比如:一个字符为一组,数据组配备起始位和结
束位。所以这种传输方式的效率是比较低的,因为额外加入了很多的辅助位作为负载,常用在低速的传输
中。
2.串口通信
串口通信(SerialCommunications)属于异步通信。串行接口(串口)是一种可以将接受来自CPU的并行
数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU
的器件。一般完成这种功能的电路,我们称为串行接口电路。
串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数
据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹
配。
二、项目描述:
本项目将设计一个串口助手上位机程序。通过本项目学习,让学生掌握Windows窗体应用程
序的设计编程方法,掌握串口(SerialPort)组件以及相关控件的编程应用
三、项目任务:
设计一个串口助手上位机程序,功能要求如下
1.具备自动和手动扫描可用串行端口功能
2.通过下拉列表框切换串口端口号
3.定时器检测串口工具异常
4.通过按钮开关打开和关闭串口
5.可以设置波特率
6.以ASCII和HEX两种格式收发信息
7.支持中文信息收发,且具有保存信息功能
8.收发信息框,并具有清除信息功能
9.可实现定时发送信息、回车换行、断帧等功能
10.可以设置CRC校验码
11.状态栏显示接收和发送信息的字节数
四、任务实施:
1. 根据项目任务需求,完成串口助手窗口界面的布局和设计。
使用到的控件有:groupBox、label、comboBox、button、checkBox、textBox、statusStrip、timer、serialPort
代码编写。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Xsl;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;
namespace 串口助手
{
public partial class MainForm : Form
{
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 系统dll导入ini写函数
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); // 系统dll导入ini读函数
string FileName = System.AppDomain.CurrentDomain.BaseDirectory + "Backup.ini"; // ini 文件名
StringBuilder BackupBuf = new StringBuilder(50); // 存储读出ini内容变量
//SerialPort serialPores = new SerialPort();