面就是用C语言编写控制串行口的程序。
#include "dos.h"
#include "stdlib.h"
#include "stdio.h"
#define PORT 0
void SendFile(char *fname); /* 发送文件*/
void Send(int s); /*发送一个字节*/
void SendFileName(char *fname); /*发送文件名*/
void ReceiveFile(); /*接收文件*/
void GetFileName(char *f); /*接收文件名*/
void InitPort(int port,unsigned char para); /*初始化端口*/ void SendPort(int port,char c); /*端口发送*/
int ReadPort(int port); /*读端口字节*/
int CheckState(int port); /*检查端口状态*/
int Receive(int port,int *G); /*接收一个字节*/
main(int argc,char *argv[])
{
if(argc<2){
printf("Please input R(receive) or S(sent) parametre:"); exit(1);
}
InitPort(PORT,231);
if(*argv[1]==''''S'''') /*检查选择的有效性*/
SendFile(argv[2]);
else if(*argv[1]==''''R'''')
ReceiveFile();
else{
printf("Error parament.Please input again.");
}
}
void SendFile(char *fname)
{
FILE *fp;
int ch,s;
if((fp=fopen(fname,"rb"))==NULL)
{
printf("Can''''t open the file.\n");
exit(1);
}
SendFileName(fname);
do{
ch=(int)getc(fp);
if(ferror(fp)){
printf("Error reading file.\n");
break;
}
s=ch%16; /*取文件中一个字节的低4位*/ Send(s);
s=ch/16; /*取文件中一个字节的高4位*/ Send(s);
}while(!feof(fp));
s=46; /*发送文件结束信息*/
Send(s);
Send(s);
fclose(fp);
}
void Send(s)
{
int G;
SendPort(PORT,s);
G=ReadPort(PORT); /*等待握手信号*/
if(s!=G)
s=s+16;
do{
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
}while(s!=G);
}
void SendFileName(fname)
char *fname;
{
int s,ch;
printf("Now transmit the file.Please wait..."); while(*fname){
ch=(int)fname++;
s=ch%16; /*取文件名中一个字节的低4位*/ Send(s);
s=ch/16;
Send(s); /*取文件名中一个字节的低4位*/
}
s=32; /*发送文件名结束标志*/
Send(s);
Send(s);
}
void ReceiveFile(){
FILE *fp;
int G1,G2,G3;
char fname[15];
GetFileName(fname);
printf("Receiving file %s.\n",fname);
remove(fname);
if((fp=fopen(fname,"wb"))==NULL)
{
printf("Can''''t open output file.\n");
exit(1);
}
/*循环为检测每次接受的数据是否为新数据,如果不是,*/
/*则用此次接收的数据覆盖上次接收的数据*/
G1=ReadPort(PORT);
G2=Receive(PORT,&G1);
do{
G3=Receive(PORT,&G2);
ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/ putc(ch,fp);
if(ferror(fp)){
printf("\nError writing file.");
exit(1);
}
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!=48);
printf("\nTransmit finished.");
fclose(fp);
}
int Receive(port,G)
{
int GM;
SendPort(port,*G);
GM=ReadPort(port);
if(GM/16==0)
return GM;
else if(GM/16==1){
do{
*G=GM;
SendPort(port,GM);
GM=ReadPort(port);
}while(GM/16==1);
}
return GM;
}
void GetFileName(char *f) {
int G1,G2,G3;
char ch;
G1=ReadPort(PORT);
G2=ReadPort(PORT);
do{
G3=Receive(PORT,&G3); ch=(char)(G1%16+G2/16); *f=ch;
*f++;
G2=Receive(PORT,&G3); G1=G3;
}while(G1/16!=32);
printf("File name transmit finished.\n"); }
void InitPort(port,para)
int port;
unsigned char para;
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=0;
reg.h.al=para;
int86(0x14,?,?);
}
void SendPort(port,c)
int port;
char c;
{
union REGS reg;
reg.x.dx=port;
reg.h.al=c;
reg.h.ah=1;
int86(0x14,?,?);
if(reg.h.ah&128){
printf("\nSend mistakes!");
exit(1);
}
}
int ReadPort(port)
int port;
{
union REGS reg;
while(!(CheckState(port)&256)){
if(kbhit()){/*如端口长期无数据可人为终止等待*/ printf("Press any key to exit.");
getch();
exit(1);
}
}
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,?,?);
if(reg.h.ah&128){
printf("\nRead mistake!");
exit(1);
}
return reg.h.al;
}
int CheckState(port)
int port;
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=3;
int86(0x14,?,?);
return reg.x.ax;
}
一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include
static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);
c语言串口通信范例 This manuscript was revised by the office on December 22, 2012
一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20
static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100);
void main() { delayms(100); init(); //初始化系统 delayms(100); init_wdt(); //初始化看门狗 while(1) { while(!RI_0) //是否收到数据 { clr_wdt(); } RI_0=0; //清除接收中断标志 buffer=S0BUF; if(buffer==0x5a) //检测祯头0 start0=1; if(buffer==0x54) //检测祯头1 start1=1; if(buffer==0x5a) //检测祯尾0 end0=1; if(buffer==0xfe) //检测祯尾1 end1=1; if((start0==1)&(start1==1)) { buff[i]=buffer; //从祯头1开始存储数据 i++; } if((end0==1)&(end1==1)) //是否已经接收祯尾 { count=i; //数据长度为count个 i=1; if((buff[2]==0x03)&(count==107)) //是否422指令 { buff[0]=0x5a; //重填祯头0 buff[count-4]=0; //校验和清零 for(k=2;k<(count-4);k++) //计算校验和 { buff[count-4]+=buff[k]; } for(k=0;k S0BUF=buff[k]; while(!TI_0); //等待发送完成 TI_0=0; //清除发送中断标志 } reset(); } else if((buff[2]==0x05)&(count==7)) //是否AD测试指令 { sendad(); reset(); } else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令 { sendpaulse(); reset(); } else //如果接收错误,则恢复各标志位为初始状态以便下次接收 { reset(); } } } } void reset() { start0=0; //祯头祯尾标志位清零 start1=0; end0=0; end1=0; for(k=0;k 用C语言编写串口程序 在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬 件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言 的方便。 在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和 状态信息。这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以 及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。为解决这个 问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位) 的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)进行如下简单的编码: 0H:发送的是新的半个字节数据 1H:重新发送上次传送错误的数据 2H:文件名结束 3H:文件结束 这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就 是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节 相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通 过信息位来区分。下面就是用C语言编写控制串行口的程序。 #include "dos.h" #include "stdlib.h" #include "stdio.h" #define PORT 0 void SendFile(char *fname); /* 发送文件*/ void Send(int s); /*发送一个字节*/ void SendFileName(char *fname); /*发送文件名*/ void ReceiveFile(); /*接收文件*/ void GetFileName(char *f); /*接收文件名*/ void InitPort(int port,unsigned char para); /*初始化端口*/ void SendPort(int port,char c); /*端口发送*/ int ReadPort(int port); /*读端口字节*/ int CheckState(int port); /*检查端口状态*/ int Receive(int port,int *G); /*接收一个字节*/ main(int argc,char *argv[]) { if(argc<2){ printf("Please input R(receive) or S(sent) parametre:"); exit(1); } 该程序全部由C写成没有C++ 更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include TCHAR cRecs[200],cSends[100]; //接收字符串发送字符串 char j=0,*cCom; //接收用统计数据大小变量端口选择 BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } /*系统初始化函数*/ BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndCombo1=GetDlgItem(hwnd,IDC_COMBO1); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM1")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM2")); 面就是用C语言编写控制串行口的程序 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N] 面就是用C语言编写控制串行口的程序。 #include" " #include" " #include" " #definePORT0 voidSendFile(char*fname);/*发送文件*/ voidSend(ints);/*发送一个字节*/ voidSendFileName(char*fname);/*发送文件名*/ voidReceiveFile();/*接收文件*/ voidGetFileName(char*f);/*接收文件名*/ voidInitPort(intport,unsignedcharpara);/*初始化端口*/ voidSendPort(intport,charc);/*端口发送*/ intReadPort(intport);/*读端口字节*/ intCheckState(intport);/*检查端口状态*/ intReceive(intport,int*G);/*接收一个字节*/ main(intargc,char*argv[]) { if(argc<2){ printf("PleaseinputR(receive)orS(sent)parametre:"); exit(1); } InitPort(PORT,231); if(*argv[1]==''''S'''') /*检查选择的有效性*/ SendFile(argv[2]); else?if(*argv[1]==''''R'''') ReceiveFile(); else{ printf("Error?inputagain."); exit(1); } } voidSendFile(char*fname) /*write*/ #include 摘要: 本文说明了异步串行通信(RS-232)的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的C语言源程序的I/O通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上EIA RS-232C在标准条件下的最大通信速率仅为20Kb/S。 尽管如此,大多数外设都提供了串行口接口,尤其在工业现场 RS-232C的应用更为常见。IBM PC及兼容机系列都有RS-232的适配器,操作系统也提供了编程接口,系统接口分为DOS功能调用和BIOS 功能调用两种:DOS INT 21H的03h和04h号功能调用为异步串行通信的接收和发送功能;而BIOS INT 14H有4组功能调用为串行通信服务,但DOS和BIOS功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用C语言编写了串行通信查询和中断两种方式的接口程序。 1.串行口工作原理 微机串行通信采用EIA RS-232C标准,为单向不平衡传输方式,信号电平标准±12V,负逻辑,即逻辑1(MARKING)表示为信号电平-12V,逻辑0(SPACING)表示为信号电平12V,最大传送距离15米,最大传送速率19.6K波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位(0),然后传8(或7,6,5)个数据位(0,1), 接着可传1位奇偶校验位,最后为1~2个停止位(1),由此可见,传送一个ASCII字符(7位),加上同步信号最少需9位数据位。 @@T8S12300.GIF;图1@@ 串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送/接收器(UART),以节省CPU的时间,提高程序运行效率,IBM PC系列采用8250 UART来处理串行通信。在BIOS数据区中的头8个字节为4个UART的端口首地址,但DOS 只支持2个串行口:COM1(基地址0040:0000H)和COM2(基地址0040:0002H)。8250 UART共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读/写操作和线路控制寄存器的第7位来区分。这10个寄存器的具体功能如下: COM1(COM2) 寄存器 端口地址功能DLAB状态 3F8H(2F8H) 发送寄存器(写) 0 3F8H(2F8H) 接收寄存器(读) 0 3F8H(2F8H) 波特率因子低字节1 3F9H(2F9H) 波特率因子高字节1 3F9H(2F9H) 中断允许寄存器0 3FAH(2FAH) 中断标志寄存器 3FBH(2FBH) 线路控制寄存器 3FCH(2FCH) MODEM控制寄存器 3FDH(2FDH) 线路状态寄存器 模拟串口的C语言源程序代码 本程序是模拟串口硬件机制写的,使用时可设一定时中断,时间间隔为 1/4 波特率,每中断一次调用一次接收函数,每中断4 次调用一次发送函数,不 过.对单片机来说时钟并须要快.要知道9600 的波特率的每个BIT 的时间间隔是 104us.而单片机中断一次压栈出栈一次的时间是20us 左右(标准的51 核12M 晶体)这样处理时间就要考虑清楚了.呵呵.以下程序是放在定时器中断程序函数内 的 //接收部分sbit JieShou_D= ;//定义接收端口uint8 DingShiJiShu,JieShou_h;//定时计数,接收缓冲器uint16 JieShou_T;//接收临时寄存器bit KaiShi,JieShou_b;// 开始接收标准,接收完成标志 void JieShou(void) //接收函数,每4 次调用接收一位{ if((KaiShi==0) (JieShou_D==0)) //串行开始位到来{ DingShiJiShu=0; //开始定时计数KaiShi=1; JieShou_T=0xffff; //接收临时寄存器置全1 } else if((KaiShi==1) (DingShiJiShu==1)) //第2 次调用,串行数据采样时间到来{ JieShou_T = 1; if(JieShou_D) JieShou_T |=0x8000; } else if(JieShou_T 0x807f ==0x803f) //接收完成JieShou_T=1xxx_xxxx_x011_1111 { KaiShi=0; DingShiJiShu=0; JieShou_h = JieShou_T 7; //右移7 位得到串行数据JieShou_b=1; } if(KaiShi) { DingShiJiShu++; //只在开始接收时定时计数+1 DingShiJiShu =0x03; //每4 次调用接收一位} } //发送部分sbit FaSong_D= ;//定义发送端口uint16 FaSong_h; //发送缓冲区bit FaSong_b; //发送完成标志 void KaiShiFaSong(uint8 fs) //设置发送数据,开始发送{ FaSong_h = fs; FaSong_h = 1; FaSong_h |= 0x0200; //FaSong_h=0000_001x_xxxx_xxx_0 #include 用C语言实现串口通信 姓名: 学号: 专业:通信工程 用C语言实现串口通信(单片机和单片机) 摘要:介绍用汇编语言实现单片机与单片机之间的串口通信,通过对其中一个单片机的操作,完成另一个单片机功能的实现。并介绍了实现该功能的原理算法、硬件框图、软件流程图,以及调试过程、步骤和结果。并对结果进行了分析。 引言:简要介绍了RS232,为什么要用RS232 ,RS232和其他接口的比较优缺点。 原理: 1什么是RS232:RS是指推荐标准的英文缩写,232是标识号。RS232是由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口,是个人计算机上的通讯接口之一。通常RS-232 接口以9个引脚(DB-9) 或是25个引脚(DB-25) 的型态出现,一般个人计算机上会有两组RS-232 接口,分别称为COM1 和COM2。 2.RS232接口及其接法 实现RS232通信的关键点是:RXD连TXD,TXD连RXD,GND接地。只要这三根线连接好,就可以实现串口通信。 3.串口初始化 串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下: ●确定T1的工作方式(编程TMOD寄存器); ●计算T1的初值,装载TH1、TL1; ●启动T1(编程TCON中的TR1位); ●确定串行口控制(编程SCON寄存器);串行口在中断方式工作时,要进行中断设置(编 程IE、IP寄存器)。 4.语句说明 1)发送函数 void com(uchar com) { SBUF=com; while(!TI); TI=0; } 2)串口初始化 一、引言: 现在在工业现场很少有人再用C语言做串口通讯程序了,但是基于DOS环境的程序还是有它的优势的。DOS系统的单任务环境是系统运行更加稳定、可靠;在一些追求很高的可靠性的系统中还是有一定的价值的。本文通过C语言控制PLC实现简单的物料传送为例子。 二、硬件介绍: 1、CPM1A采用RS232串口通讯与上位机连接,在PLC的DM区中可以设定串口参数,本文采用默认值: 串口通信格式: 1位---起始位、9600---波特率、7位---数据位、2位---停止位、偶校验 2、C语言中用于串口读写的函数:bioscom,在bios.h头文件中。 Bioscom用法:bioscom(int cmd,char byte,int port) Cmd的值:0 设置通信参数为btye值 1 发送一个字符到串口 2 从串口接收一个字符 3 返回串口端口的状态 byte的值:0x02 7数据位0x03 8位数据位 0x00 1个停止位0x04 2个停止位 0x00 无奇偶校验0x08奇校验 0x18偶校验0x80 1200波特率 0xA0 2400波特率0xC0 4800波特率 0xE0 9600波特率 注意:在对串口初始化时,上述参数值相或附给byte。 Port的值:0 端口1 1 端口2 三、完整源代码: #include /* 此头函数请不要删除*/ #include #include #define F1 0x3B /*启动*/ #define F2 0x3C /*停止*/ #define F3 0x3D /*混料*/ #define F4 0x3E /*出料*/ #define F5 0x3F /*退出*/ #define PORT 0 /*定义端口号*/ #define SETTINGS (0x02|0x04|0x18|0xE0) /*设定参数*/ /* 定义发送字符函数send */ void sendPort(int port,char cc) { union{ char ch[2]; int status; 一个c语言的串口通信程序例 标签: 分类:技术笔记 c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include 面就是用C语言编写控制串行口的程序。 #include "" #include "" #include "" #define PORT 0 void SendFile(char *fname); /* 发送文件*/ void Send(int s); /*发送一个字节*/ void SendFileName(char *fname); /*发送文件名*/ void ReceiveFile(); /*接收文件*/ void GetFileName(char *f); /*接收文件名*/ void InitPort(int port,unsigned char para); /*初始化端口*/ void SendPort(int port,char c); /*端口发送*/ int ReadPort(int port); /*读端口字节*/ int CheckState(int port); /*检查端口状态*/ int Receive(int port,int *G); /*接收一个字节*/ main(int argc,char *argv[]) { if(argc<2){ printf("Please input R(receive) or S(sent) parametre:"); exit(1); } InitPort(PORT,231); if(*argv[1]==''''S'''') /*检查选择的有效性*/ SendFile(argv[2]); else if(*argv[1]==''''R'''') ReceiveFile(); else{ printf("Error input again."); #include CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a); outp(ComPortAddr+1,0x01); disable(); OldAsyncInt=getvect( IntVectNum ); setvect( IntVectNum, AsyncInt ); enable(); 一个c语言的串口通信程序范例 标签: 分类:技术笔记 c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include 摘要本文说明了异步串行通信(RS-232)的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的C语言源程序。 的I/O通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上EIA RS-232C在标准条件下的最大通信速率仅为20Kb/S。尽管如此,大多数外设都提供了串行口接口,尤其在工业现场RS-232C的应用更为常见。IBM PC及兼容机系列都有RS-232的适配器,操作系统也提供了编程接口,系统接口分为DOS功能调用和BIOS功能调用两种:DOS INT 21H的03h和04h号功能调用为异步串行通信的接收和发送功能;而BIOS INT 14H有4组功能调用为串行通信服务,但DOS和BIOS功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用C语言编写了串行通信查询和中断两种方式的接口程序。 1.串行口工作原理 微机串行通信采用EIA RS-232C标准,为单向不平衡传输方式,信号电平标准±12V,负逻辑,即逻辑1(MARKING)表示为信号电平-12V,逻辑0(SPACING)表示为信号电平+12V,最大传送距离15米,最大传送速率19.6K波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位(0),然后传8(或7,6,5)个数据位(0,1),接着可传1位奇偶校验位,最后为1~2个停止位(1),由此可见,传送一个ASCII字符(7位),加上同步信号最少需9位数据位。 @@T8S12300.GIF;图1@@ 串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送/接收器(UART),以节省CPU的时间,提高程序运行效率,IBM PC系列采用8250 UART来处理串行通信。 在BIOS数据区中的头8个字节为4个UART的端口首地址,但DOS只支持2个串行口:COM1(基地址0040:0000H)和COM2(基地址0040:0002H)。8250 UART共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读/写操作和线路控制寄存器的第7位来区分。这10个寄存器的具体功能如下:COM1(COM2) 寄存器 端口地址功能DLAB状态 3F8H(2F8H) 发送寄存器(写) 0 3F8H(2F8H) 接收寄存器(读) 0 3F8H(2F8H) 波特率因子低字节1 3F9H(2F9H) 波特率因子高字节1 3F9H(2F9H) 中断允许寄存器0 3FAH(2FAH) 中断标志寄存器 3FBH(2FBH) 线路控制寄存器 3FCH(2FCH) MODEM控制寄存器 3FDH(2FDH) 线路状态寄存器 3FEH(2FEH) MODEM状态寄存器 注:DLAB为线路控制寄存器第七位在编写串行通信程序时,若采用低级方式,只需访问UART的这10个寄存器即可,相对于直接控制通信的各个参量是方便用C语言编写串口程序
C语言串口通信助手代码
面就是用C语言编写控制串行口的程序修订稿
串口通信linux c语言实现
C语言实现串口通信
模拟串口的C语言源程序代码
51单片机的串口通信程序(C语言)
用C语言实现串口通信
C语言 做串口通讯程序
c语言串口通信范例
面就是用C语言编写控制串行口的程序
一个c语言的串口通信程序范例
c语言串口通信范例
C语言实现串行通信接口程序