串行口发送子程序C语言,基于C语言的RS232串行接口通信实现
摘要:串口通信是一种广泛使用且实用的通信方式,介绍RS232串行通信的联结方式,研究利用c语言编程实现RS232串行通信的过程。结合实际应用,在约定双方串行通信协议的基础上,运用C语言开发的串行通信软件,实现了企业生产线产品测试平台和嵌入式EMB主控机的串行数据通信。
0前言
串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口。虽然近年来随着USB口的日趋流行,RS232接口串口作为一种传统的串口通信口有被取代的趋势。然而由于它具有较高的性价比和传输的可靠性Ⅲ。在传输速率要求不是很高的情况下,串口通信仍然具有其自身的优势。同时RS232标准广泛应用于微型计算机系统和大型系统中,RS232标准还具有连线简单、通讯距离长等优点,本文将着熏介绍串口通信的连接方式以及利用C语言编程实现串口通讯,以实际的工程项目应用,验证了该通讯方式的可靠性。
1 RS232串行接口
1.1 RS232接口简介
RS232串行接口属于个人计算机(PC)及电信应用领域中为成功的串行数据标准。它被定义为一种在低速率串行通信中增加通信距离的单端标准,是目前PC机与通信工业中应用广泛的一种串行接口嗍。现在的Pc机一般至少有两个串行口COMI和COM2.新一代的汁算机主要以9引脚的D型接头接出所有的RS232通信信号及控制线(有的计算机的COM2仍为25引脚)。
1.2 RS232串口引脚说明(见表1)
表1引脚缩写功能说明
1.3串口连接器的连接方式
串口连接器是两个串行接口的连接器,RS232串口存在9针和25针两种形式,根据连接的针数,串口通信连接方式主要分为:1)无握手连接方式;2)全握手连接方式;3)循环握手回送方式。本文开发的软件运行在全握手连接方式下,该连接方式如表2所示。
表2全握手连接
2 C语言串口通信软件实现
2.1测试中的硬件设备。
2.1.1单机测试方式
如果单机仅仅拥有一个RS232串口,可将RS232连接线的第2引脚(RD)与第3引脚(TD)短路,那么由第3引脚的输出信号就会被发送到第2引脚而送到同一串行端}1的输入缓冲区,即可将数据读入,进入测试过程。
如果单机拥有COMl和COM2口两个RS232串口,那么请选择1 3节表2中的串口连接方式,进入测试过程。
2.1.2近距离两台设备通信测试方式
如果要在两台PC计算机之间,一台嵌入式系统主控机和一台PC计算机之间,或者上位机和下位机之间进行串口通信,那么请选择1.3节表2中的RS232串口方式连接两台设备,进入测试过程。
2.1.3远距离两台通信测试方式
RS232标准规定,若不使用Modem,在码元畸变小于4%的情况下,DTE和DCE通信两端之间传输距离为15 m.若距离较远,须附加调制解调器(Modem)。其连接方式如图1所示。
图1 远距离串口通信连接方式
2.2 C语言的串口通信软件实现
2.2.1串口通信软件流程图
图2数据通信的流程图
2.2.2 C语言函数具体实现串口通信软件过程
由于I/O串行通信口的速度远远低于CPU的速度,在查询工作方式时,CPU长时间处于等待状态,其效率非常低,不利于CPU的资源利用。解决这一矛盾的有效办法是采取中断的通信方式,即当通信口自身准备就绪时,主动提出中断申请,一旦CPU响应此申请,便暂停执行的工作,转向中断服务子程序,与外设进行数据的交换,数据交换完成后返回到主程序中的断点继续执行未完成的任务,这样就避免了CPU资源的浪费㈨。
为此必须对异步通信适配器以及中断控制器进行控制。作为系统的外设,异步通信适配器和中断控制器都有其对应的I/O口地址,所以本文采用C语言函数库中的寻址函数outportb()和函数inportb()对上述芯片进行直接读写操作。其控制包括对中断控制器地址的编程,允许IRQ3,IRQ4中断,同时置MODEM控制寄存器地址为有效,这样即可实现中断方式的通信。根据图2的串口通信流程图,其具体实现串口通信的过程如下:
1)初始化串口函数。
参数说明:
ComPortAddr 串口端口地址(coMl口是03F8H COM2口是02F8H)
IntVectNum 中断处理号(一般选择0X0b)
Baud 波特率
Data 数据位
Stop 停止位
Parity 奇偶校验位
void Init-COM(int ComPortAddr,unsigned char IntVectNum,im Baud,unsigned char Data,unsigned char Stop,unsigned char Parity)
{
unsigned char High,Low;
int f.
comportaddr=ComPortAddr;
intvectnum=IntVectNum;
CharslnBuf=0;Circln=0;CircOut=0;
/*set baud rate设置波特率*/
f=(Baud/100):
f=1152/t;High=f/256;
Low=f-High*256;
outportb(ComPortAddr+3,0x80);
outportb(ComPortAddr,LOW);
outportb(ComPortAddr+l,High);
/*set data bits,stop bits,and parity设置数据位。停止位。校验*/
Data=(Data-5)|((Stop-1)*4);
if(Parity=2)Data=Data|0x18;
else if(Parity==1)Data=Data|0x8;
outportb(ComPortAddr+3,Data);
/*set MCR(DTR,RTS=0,OUTl,OUT2=1)设置MODEM控制位*/
outportb(ComPortAddr+4,0xob);
/*set input data ready interrupt mode设置输入数据中断模式*/
outportb(ComPortAddr+1,Ox01);
/*set OC interrupt vector设置中断源*/
disable ();
OldAsyncInt=getvect(IntVectNum);
setvect(ImVectNum,AsyncInt);
enable ();
/*open interrupt打开中断*/
maskb=inp(Port8259+1);
if(IntVectNum一0x0c)outport(Port8259+1,maskb&Oxef);/*INT4*/
else outport(Port8259+1,maskb&0xf7);/*INT3*/
}
2)握手信号控制。
该函数引入递归调用的方式,很好的解决了以往串口通信过程中,在握手信号方面选择发送指定特定字符(例如"样")所带来的误传送问题,大大提高了串口通信的成功率。
void wait(char ch)
{
if(ReceiveChar(COM232)==ch)return;//确定对方已经成功接受或者发送,就返回空
else
{
SendChar(ch);//把接受或者发送出去的字符重新发送;
wait(ch); //递归调用,直到对方确定接受或者发送成功为止;
)
)
3)向串行口发送一个字符
该函数的思想是先申请占有中断,后进行发送数据通信;
int SendChar(unsigned char Char)
{
do
{
printf("send waiting>>>>>>>>>\n"):
//在屏幕上提示用户正在等待中断进行。
}while((inportb(comportaddr+5)&0x20)==O);//检查发送端数据线是否准备好
outportb(comportaddr,Char://发送数据到缓冲区
return(Char);//返回发送完成的字符
}
4)从串行口接受一个字符
该函数的思想是先取得中断控制,后面进行接收数据通信;
int ReceiveChar(int port)
{
do{
printf("receive waiting>>>>>>>>\n");
∥在屏幕上提示用户正在等待中断进行。
}
while((inportb(eomportaddr+5)&0x01)==0);//检查接收端数据线是否准备好
return(inportb(pont);//从接收数据缓冲区取数据
}
3 实例
在企业产品测试平台和嵌入式控制系统之间,约定通信双方的协议相同,首先嵌入式EMB主控机通过串El把控制消息发送给产品测试平台,让产品测试平台根据发送来的指令进行相关操作:同时在产品测试平台上的测试结果信息,测试每个单项目的相关信息也通过串口传输数据到嵌入式EMB主控机;嵌入式EMB主控机把测试相关的有效信息进行整理后,通过网络上传到Server,Server把企业所有生产线的嵌入式EMB主控机发送来的信息进行整理和分析,在企业资源管理系统ERP上共享,让企业的管理人员实时监视企业生产的进行情况,大大提高企业的办公效率,其整体工作原理图如图3所示。
图3企业生产整体工作原理图
4结论
本文所阐述的RS232串口通信软件,在具体实践中结合功能需要,综合考虑复杂程度、灵活性等因素,选择了合适的方法,实现了串口通信过程,同时在产品测试平台和嵌入式控制系统之间,该软件得到了充分的应用,有效地提升了企业的生产工作效率。
参考文献:
串行口发送子程序C语言,基于C语言的RS232串行接口通信实现相关推荐
- 串行口发送子程序C语言,运用C语言对串行口进行操作.pdf
运用C语言对串行口进行操作 第 27 卷第 5 期 唐山师范学院学报 2005 年 9 月 Vol. 27 No.5 Journal of Tangshan Teachers College Sep. ...
- 51汇编练习——串行口的传输
编写一个发送程序:采用串口工作方式1将8051单片机P1口采集的8位数据实时串行传输.无需奇偶校验,采用中断方式.波特率为9600波特(晶振频率为11.0592MHz). ORG 0000H LJMP ...
- (九)单片机串行口 内部结构的讲解 01
1. 基本概念 常用于数据通信的传输方式有单工.半双工.全双工和多工方式. 单工方式:数据仅按一个固定方向传送.因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集. 半双工方 ...
- 20.串行口通信原理及操作流程
c 第六章:串行口通信原理及操作流程 6.1并行与串行基本通行方式 单片机通信是指单片机与计算机或单片机与单片机之间的信息交换,后者的通信通常用的较多. 通信有并行和串行龄种方式,在单片机系统以及现代 ...
- 51汇编——定时器中断、串行口中断
定时1s亮灭10次 ORG 0000H LJMP MAIN ORG 000BH LJMP TIMER0 ORG 0030H MAIN: MOV R0,#10 ;循环10次,使定时100ms*10产生1 ...
- 232通信c语言设计,基于C语言的RS232串行接口通信设计与实现
摘要:串口通信是一种广泛使用且实用的通信方式,介绍RS232串行通信的联结方式,研究利用c语言编程实现RS232串行通信的过程.结合实际应用,在约定双方串行通信协议的基础上,运用C语言开发的串行通信软 ...
- c语言接收rs232串口速率,C语言在RS232串行接口通信中的实现
串口通信是一种广泛使用且实用的通信方式,介绍RS232串行通信的联结方式,研究利用c语言编程实现RS232串行通信的过程.结合实际应用,在约定双方串行通信协议的基础上,运用C语言开发的串行通信软件,实 ...
- 单片机串口全双工C语言,C系列单片机有一个全双工的串行口.ppt
C系列单片机有一个全双工的串行口.ppt 80C51系列单片机有一个全双工的串行口,这个口既可以用于网络通信,也可以实现串行异步通信,还可以作为同步移位寄存器使用. 2.串行控制寄存器SCON 3.电 ...
- 51单片机串行口程序c语言编程,单片机C语言编程串行口通讯.ppt
单片机C语言编程串行口通讯 第7章 MCS-51单片机串行口 第7章 MCS-51单片机串行口 目 录 7.1 串行通信基本知识 7.2 串行口结构及控制 7.3 串行口工作方式 7.4 串行口应用举 ...
最新文章
- UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0: ordinal not in range(128)
- Latex之WinEdt编辑界面的自动换行
- 频谱中负频率的物理意义(二)
- 论文阅读——《Robust Superpixel Tracking》
- maven版本控制实战
- Hadoop宿醉:使用Apache Whirr启动hadoop集群CDH4
- 利用qt和ffmpeg软件来制作视频裁剪工具
- atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现
- ROMS 编译upwelling.h
- 有创意的思维导图要怎样绘制
- 在html中什么标签可以显示小方块,css列表前的小方块
- 转载之-中值滤波均值滤波
- 电线电缆的五大种类解释及结构意义(转载)
- window server 2012 更改密钥 更改系统序列号
- 稠密集和疏朗集_稠密集与疏朗集.pdf
- zenly安卓_Zenly安卓APP下载-Zenly安卓APP下载安装包 v4.31.0
- Git暂存区的意义或git add的意义
- 【亲密关系】001 亲密关系的影响因素
- IPGUARD Linux系统客户端安装与卸载
- python字符串查找重复项,Python程序查找字符串中所有重复的字符
热门文章
- Qt 垂直布局 (QVBoxLayout)
- 基于Vue+ElementUI实现的数据分析后台管理系统
- npm install -g n 报错 Windows
- 电影流浪地球2投资成本多少?如何参与投资?风险系数高吗?
- TDengine服务器端启动失败问题(客户端连接失败问题)
- xss-labs-master通关秘籍
- 什么是AB实验?能解决什么问题?终于有人讲明白了
- [BMVC 2021] Feature Fusion Vision Transformer for Fine-Grained Visual Categorization
- Docker管理软件
- 恶意软件免杀与技术(2022.05.05)