想了解java串口编程教程吗?想了解C# SerialPort连接串口,读写串口数据,C#串口介绍及串口通信程序设计实现(附程序分享),Linux下串口编程基础,串口编程 - 串口简介?? 吗?......本文带你一探究竟。
一、起始最近在公司做上位机,上位机要求是能够读取一款支持串口通信的传感器并且把传感器的数据用图表显示出来,且上位机能对传感器发送指令,需求有涉及到串口通信和绘制图表。那么首先要解决的问题就是能够让电脑上的程序进行串口通信,有串口通信的编程语言有很多,C++,C#,JAVA,Python等语言都是支持串口通信的。我选择了使用C#,因为上位机主要是在Windows操作系统上运行,而C#对于winodws桌面应用的开发支持是比较方便的,功能也比较强大,尤其是WPF程序,做出来的UI页面比较好看那么本篇内容就介绍c#程序怎么实现串口通信二、工具准备开发工具:Visual Studio 2021 Community 开发工具下载:免费的 IDE 和开发人员工具 | Visual Studio Community维特智能姿态角度传感器JY901模块*1USB-TLL模块*1、杜邦线*1三、新建项目1.新建项目,选择WPF应用程序,你可能会发现两个 WPF 桌面模板,一个用于 .NET Framework,另一个用于 .NET Core。 .NET Core 模板在 Visual Studio 2021 16.3 及更高版本中可用。 你可以在本教程中使用任何一个,但建议使用 .NET Core 进行新的开发。2.在下一屏幕中指定“项目名称”和选择“项目路径”,然后点击“创建”四、添加串口通信引用1.右击项目解决方案“管理NuGet程序包”,搜索“Ports”关键字,添加System.IO.Ports引用。System.IO.Ports包是.Net 2.0以来集成的免费的串口通信包,五、建立串口通信工具类创建工具类,为了后面能够方便的操作串口我们先实现一个串口操作的工具类,串口通信中用到最多的操作就是“搜索串口”,”打开/关闭串口“,”接收数据“,“发送数据”,我们可以先实现以上操作的方法。搜索串口实现,搜索串口可以直接调用类的方法,该方法会返回一个串口名称的string数组。打开关闭串口实现,这里传入“串口名称”和“波特率”参数打开串口,如果有需要其他参数可以修改方法参数。打开串口后把做为接收事件的委托。接收串口数据的委托方法实现,sender对象为串口对象,接收数据后直接向控制台打印数据发送数据实现,检查串口是否打开,然后向串口发送数据并且打印到控制台,这样一个简单的串口通信工具类就实现了六、工具类完整代码public class { public static string[] () { return .(); } public static = null; public static (string comName,int baud) { //串口未打开 if ( == null|| !.IsOpen) { = new (); //串口名称 .PortName = comName; //波特率 .BaudRate = baud; //数据位 .DataBits = 8; //停止位 .StopBits = StopBits.One; //校验位 .Parity = Parity.None; //打开串口 .Open(); //串口数据接收事件实现 . += new (); return ; } //串口已经打开 else { .Close(); return ; } } public static void (object sender, e) { _ = ()sender; int _ = _.; byte[] recvData = new byte[_]; _.Read(recvData, 0, _); //向控制台打印数据 Debug.WriteLine("收到数据:"+ recvData); } public static bool SendData(byte[] data) { if ( != null && .IsOpen) { .Write(data, 0, data.Length); Debug.WriteLine("发送数据:" + data); return true; } else { return false; } } } 七、工具类收发数据演示JY901连接我的电脑是COM3测试方法,在创建方法,方法先搜索一遍串口,打印所有串口的名称;然后打开COM3,向COM3发送一条指令调试输出结果COM3 发送数据:System.Byte[] 收到数据:System.Byte[] 收到数据:System.Byte[] 收到数据:System.Byte[] 收到数据:System.Byte[] 收到数据:System.Byte[]调试后发现输出的数据是一个Byte数组,是的在串口开发中收到的数据都是byte形式的,在串口开发过程中经常会遇到byte数据和二进制、十进制、十六进制的数据。下一篇“C#十六进制、十进制、二进制、字符串数据互转”将详细介绍串口开发中用到的数据装换八、结语再为大家介绍一个优秀的C#开源串口助手项目码云OSDA开源串口助手项目地址:Leven/OSDA感谢阅读本篇“C# 连接串口,读取串口数据”,本篇到此结束,下一篇“C#十六进制、十进制、二进制、字符串数据互转”
一、简介串行接口简称串口(Serial Interface),也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。9位针脚功能对应如下: 载波检测(DCD) 接受数据(RXD) 发出数据(TXD) 数据终端准备好(DTR) 信号地线(SG) 数据准备好(DSR) 请求发送(RTS) 清除发送(CTS) 振铃指示(RI)二、串口应用工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!比如电表的通信接口就是串口通信。上述9针脚接口中,我们一般只接出RXD TXD两针,外加GND,即可实现两台设备之间的串口通信。三、串口通信协议空闲位:UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。起始位:每开始一次通信时发送方先发出一个逻辑”0”的信号(低电平),表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。数据位:起始位之后就是我们所要传输的数据,数据位可以是5、6、7、8,9位等,构成一个字符(一般都是8位)。如ASCII码(7位),扩展BCD码(8位)。先发送最低位,最后发送最高位,使用低电平表示‘0’高电平表示‘1’完成数据位的传输。奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位其实是调整个数,串口校验分几种方式:1、无校验(no parity)。2、奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。3、偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。4、mark parity:校验位始终为1(不常用)。5、parity:校验位始终为0(不常用)。停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。波特率:数据传送速率用波特率来表示,单位bps(bits per second),即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us。四、C#程序设计首先在VS中建立Windows窗口程序;串口通信程序中首先设置串口相关必要信息,包括:串口号,波特率,数据位,停止位,校验位等,以及接受与发送的数据量Rx与Tx。基本逻辑是:打开软件后,首先获取现在存在的串口号,添加至串口号选择栏的下拉项目中: rivate void comboBox_Port_Update() { keyCom = Registry..("Hardware\\DeviceMap\\"); //需要调用Win32 if(keyCom != null) { string[] sSubKeys = keyCom.(); foreach(string sName in sSubKeys ) { string sValue = (string)keyCom.GetValue(sName); comboBox1.Items.Add(sValue ); } } } 3. 添加发送和接收项目,并且设置发送按钮与清除接收消息框的清除按钮:4. 测试各项功能,以及调试bug。需要考虑这些情况:(1)串口还没打开就发送数据,需要弹出警告框提示串口还未打开:(2)发送栏的参数还没设置完整,就点击发送按钮:还有一些设计交互逻辑,在慢慢测试中就会发现,在此不再一一列举。有需要程序源代码的同学私信我,或者不介意的话可以加微信storm22交流。C#串口介绍及串口通信程序设计实现(附程序分享)
Linux下串口编程基础一、串口概述串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺。二、串口编程1. 串口需要的头文件 1: #include <stdio.h> /*标准输入输出定义*/ 2: #include <stdlib.h> /*标准函数库定义*/ 3: #include <unistd.h> /*Unix 标准函数定义*/ 4: #include <sys/types.h> 5: #include <sys/stat.h> 6: #include <fcntl.h> /*文件控制定义*/ 7: #include <termios.h> /*POSIX 终端控制定义*/ 8: #include <errno.h> /*错误号定义*/2. 打开关闭串口对于串口设备文件的操作与其他文件操作基本相同。可以使用系统调用open(), close()打开或关闭串口。在Linux下串口文件是在/dev下的,例如串口一为/dev/ttyS0,串口二为/dev/ttyS1。open(),close()系统调用的原型 1: #include <fcntl.h> 2: #include <sys/types.h> 3: #include <sys/stat.h> 4: int open(const char *path, int oflags); 5: int open(const char *path, int oflags, mode_t mode); 6: #include <unistd.h> 7: int close(int fildes); 8: 实例:打开串口ttyS0。 9: int fd; 10: /*以读写方式打开串口*/ 11: fd = open( "/dev/ttyS0", O_RDWR); 12: if (-1 == fd){ 13: /* 不能打开串口一*/ 14: perror("open serial port error"); 15: }3. 设置串口设置串口包括波特率设置、校验位、停止位设置。在串口设置中主要是设置struct termios结构体成员的值。struct termios结构如下 1: #include <termios.h> 2: struct termio 3: { 4: unsigned short c_iflag; /* input options输入模式标志 */ 5: unsigned short c_oflag; /* output options输出模式标志 */ 6: unsigned short c_cflag; /* control options控制模式标志*/ 7: unsigned short c_lflag; /* local mode flags */ 8: unsigned char c_line; /* line */ 9: unsigned char c_cc[NCC]; /* control */ 10: };l 波特率的设置波特率:每秒钟传送的二进制位数,用 b / s 表示(b表示bit)。设置波特率需要对c_cflag进行操作。c_cflag支持的波特率设置项如下: mask for baud rateB00 baud (drop DTR)B5050 baudB7575 .5 ,600 ,800 ,200 baud设置c_cflag需要激活两个选项,CLOCAL和CREAD,它们分别为本地连接和串口接收使能。波特率的设置并不能直接对c_cflag进行赋值操作,Linux提供系统调用()和()来设置波特率。原型: 1: int (struct termios *termptr, speed_t speed); 2: int (struct termios *termptr, speed_t speed); 参数中termptr为指向termios结构体的指针,speed为要设置的波特率。如果成功返回0,否则返回-1。在波特率设置完成后调用tcsetattr()来激活设置。原型: 1: #include <termios.h> 2: int tcsetattr(int fd, int actions, const struct termios *termios_p);参数中actions控制如何对串口设置进行改变,可选项为:TCSANOW: 立即对值进行修改。TCSADRAIN: 在当前输出完成后再对值进行修改。TCSAFLUSH: 在当前输出完成后再对值进行修改,但还要丢弃当前的可用输入数据和尚未从 read 调用的返回值。实例:设置波特率 1: struct termios options; 2: /* 3: * 得到当前串口设置,保存在options中 4: */ 5: tcgetattr(fd, &options); 6: /* 7: * 设置波特率为19200 8: */ 9: (&options, B19200); 10: (&options, B19200); 11: /* 12: * 本地连接和接收使能 13: */ 14: options.c_cflag |= (CLOCAL | CREAD); 15: /* 16: * 应用设置(立即应用) 17: */ 18: tcsetattr(fd, TCSANOW, &options);l 数据位、校验位与停止位的设置对于数据位的设置没有专用的系统调用,你可以使用位掩码的操作来设置数据位。实例:选择8位数据位 1: options.c_cflag &= ~CSIZE; /* 清除数据位掩码Mask the character size bits */ 2: options.c_cflag |= CS8; /* 选择8位数据位Select 8 data bits */校验位需要设置c_cflag和c_iflag。首先要激活c_cflag的校验位使能标志PARENB(parity enable),选择是否使用偶校验PARODD,然后激活c_iflag中奇偶校验使能位(INPACK enable parity check | ISTRIP strip parity bits)。实例:选择奇校验 1: options.c_cflag |= PARENB; 2: options.c_cflag |= PARODD; 3: options.c_iflag |= (INPACK|ISTRIP);选择偶校验 1: options.c_cflag |= PARENB; 2: options.c_cflag &= ~PARODD; 3: options.c_iflag |= (INPACK|ISTRIP);停止位的设置是通过激活c_cflag中的CSTOPB实现的,停止位为1,清除CSTOPB,停止位为0,激活CSTOPB。实例: 设置停止位为1。 1: options.c_cflag &= ~CSTOPB;l 最少字符和等待时间的设置设置c_cc成员数组中的VTIME和VMIN分别设置等待时间和最少字符。VTIME和VMIN的值决定串口的等待时间和接收的最少字符,在此之前,会堵塞串口直到到达设置的时间或者字符个数。实例:将最少字符和等待时间设置为0 1: options.c_cc[VTIME] = 0; 2: options.c_cc[VMIN] = 0;4. 读写串口读写串口和普通的文件操作相同,分别使用read()和write()。原型: 1: #include <unistd.h> 2: size_t read(int fields, void *buf, size_t nbytes); 3: size_t write(int fildes, const void *buf, size_t nbytes);实例:写串口 1: char buffer[] = “hello world”; 2: int length = 11; 3: int nByte; 4: nByte = write(fd, buffer, length);嵌入式物联网资料分享交流群:332650978 入群有全套学习视频资料电子书免费赠送!参考资料:嵌入式开发直播课 - 走进linux底层驱动Linux 基础_JAVA嵌入式开发直播课 - STM32 USART串口的应用
串口编程 - 串口简介前言串行接口(Serial port),也称串行接口或串行端口,串行通信接口,COM接口,简称串口。主要用于串行式逐位数据传输。串口通信(Serial ),是一种非常常见的设备间的通信方式。串口通信协议是指双方约定一致的数据包格式规范(包含起始位、数据、校验位及停止位)。1.串口常见的电气标准和协议1.1 RS-232CRS-232C标准串口,是目前最常用的一种串行通信接口机械特性RS-232C采用的接口是9针或25针的D型插头,常用的一般是9针插头。DE-9 Male(Pin Side) DE-9 Female (Pin Side) ------------- ------------- \ 1 2 3 4 5 / \ 5 4 3 2 1 / \ 6 7 8 9 / \ 9 8 7 6 / --------- ---------9针插头管脚1 数据载波检测(DCD) 2 接受数据(RD、RXD) 3 发送数据(TD、TXD) 4 数据终端准备(DTR) 5 公共接地 6 数据准备好(DSR) 7 请求发送(RTS) 8 清除发送(CTS) 9 振铃指示(RI)电气特性逻辑电平:逻辑1: -3~-15V;逻辑0: 3~15V 数据最高传输速率:19200bps 最远通信距离:15m1.2 RS-422RS-232存在距离短、速率低的问题,RS-422提升了这两方面,最大传输距离1200m,最大传输速度10Mb/s机械特性一般是9针插头D型插头电气特性逻辑电平:逻辑1: 两线间的电压差+2V~+6V 逻辑0: 两线间的电压差-6V~-2V 数据最高传输速率:10Mbps 最远通信距离:1200m1.3 RS-485在RS-422基础上,RS-485增加了多点、双向通信能力,具备联网功能。机械特性一般是9针插头D型插头电气特性逻辑电平:逻辑1: 两线间的电压差+2V~+6V 逻辑0: 两线间的电压差-6V~-2V 数据最高传输速率:10Mbps 最远通信距离:1200m2. 串口数据包的组成串口数据包由起始位、数据、校验位及停止位组成。最常见的串口数据包配置为9600 8N1(9600波特率,8位数据位,无校验,1位停止位)。例如传输字符0(ASCII为48,二进制110000)01100001解释0(起始位) 110000(8位数据位) 1(1位停止位)2.1 起始位一个逻辑0(低电平)的数据位表示开始2.2 数据位起始位后的就是数据位,数据位的长度一般为5、6、7、8。2.3 校验位校验位用于校验数据是否正确。一般分为:0 - No Parity 无校验 1 - Odd Parity 奇校验 2 - Even Parity 偶校验 3 - Mark Parity 1校验 4 - Space Parity 0校验2.4 停止位数据传输结束的标志,一般由 1、1.5、2 个逻辑1(高电平)的数据位表示Reference:
上述文章了解到关于C# SerialPort连接串口,读写串口数据,C#串口介绍及串口通信程序设计实现(附程序分享),Linux下串口编程基础,串口编程 - 串口简介?? ,让我们对java串口编程教程 有一个直观的认知。我们发现,作为一个优秀的Java程序员是多么的自豪。
只要一个电话
我们免费为您回电