C语言串口通信范例
用c语言实现串口读写程序

用c语言实现串口读写程序一、前言串口通信是一种常见的通信方式,它可以实现单片机与计算机之间的数据传输。
在嵌入式系统中,使用串口通信可以方便地进行调试和数据传输。
本文将介绍如何使用C语言实现串口读写程序。
二、硬件准备在进行串口通信之前,需要准备好相应的硬件设备。
一般来说,需要一台计算机和一个串口转USB模块(或者直接使用带有串口接口的计算机)。
同时,在单片机端也需要连接一个串口模块。
三、C语言编程实现1. 打开串口在C语言中,可以通过打开文件的方式来打开串口设备。
下面是一个示例代码:```#include <stdio.h>#include <fcntl.h>#include <termios.h>int open_serial_port(const char *device_path, int baud_rate) {int fd;struct termios options;fd = open(device_path, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) {perror("open_serial_port: Unable to open device");return -1;}fcntl(fd, F_SETFL, 0);tcgetattr(fd, &options);cfsetispeed(&options, baud_rate);cfsetospeed(&options, baud_rate);options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_oflag &= ~OPOST;tcsetattr(fd, TCSANOW, &options);return fd;}```在上述代码中,open_serial_port函数用来打开串口设备,并设置相应的参数。
C语言实现串口通信

C语言实现串口通信在使用系统调用函数进行串口通信之前,需要打开串口设备并设置相关参数。
打开串口设备可以使用open(函数,设置串口参数可以使用termios结构体和tcsetattr(函数。
以下是一个简单的串口通信接收数据的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>int mainint fd; // 串口设备文件描述符char buff[255]; // 存储接收到的数据int len; // 接收到的数据长度//打开串口设备fd = open("/dev/ttyS0", O_RDONLY);if (fd < 0)perror("Failed to open serial port");return -1;}//设置串口参数struct termios options;tcgetattr(fd, &options);cfsetspeed(&options, B1200); // 设置波特率为1200 tcsetattr(fd, TCSANOW, &options);//接收数据while (1)len = read(fd, buff, sizeof(buff)); // 从串口读取数据if (len > 0)buff[len] = '\0'; // 将接收到的数据转为字符串printf("Received data: %s\n", buff);}}//关闭串口设备close(fd);return 0;```这段代码首先通过open(函数打开串口设备文件"/dev/ttyS0",然后使用tcgetattr(函数获取当前设置的串口参数,接着使用cfsetspeed(函数设置波特率为1200,最后使用tcsetattr(函数将设置好的串口参数写回。
iar c语言 通讯例程

iar c语言通讯例程摘要:本文将介绍如何使用IAR Embedded Workbench(IAR EW)开发环境中的C语言编写一个简单的串口通讯例程。
我们将使用IAR EW的GUI设计器来创建和配置项目,然后编写和调试代码。
最后,我们将测试所开发的串口通讯例程在实际的硬件平台上。
1. 安装和配置IAR Embedded Workbench首先,访问IAR Systems官方下载并安装IAR Embedded Workbench最新版。
安装完成后,启动IAR EW,然后创建一个新的项目。
2. 创建新项目在IAR EW主界面上,点击“新建”按钮,在弹出的对话框中,选择“C”作为项目类型,填写项目名称和位置,然后点击“确定”按钮。
3. 配置通讯接口在项目向导中,选择“通信”作为项目类型,然后选择“串行”作为通信方式。
在“硬件”选项卡下,选择合适的开发板和串口模块。
点击“下一步”按钮。
4. 编写串口通讯代码在项目向导的“代码”选项卡下,选择“C”作为编程语言。
点击“下一步”按钮。
在“高级”选项卡下,勾选“添加头文件和库文件”复选框,然后点击“完成”按钮。
现在,我们可以在项目工作区中看到刚刚创建的串口通讯例程。
首先,我们创建一个名为`serial_communication.c`的新源文件,然后在其中编写以下代码:```c#include <stdio.h>#include <stdbool.h>#include "peripheral_serial.h"void UART0_ISR(void) {uint16_t event = UART0_GET_EVENT();if (event == UART_EVENT_STOPPED) {printf("UART0 STOPPED\\n");} else if (event == UART_EVENT_READY) {printf("UART0 READY\\n");} else if (event == UART_EVENT_TXEMPTY) {printf("UART0 TX EMPTY\\n");} else if (event == UART_EVENT_RXFULL) {printf("UART0 RX FULL\\n");} else {printf("UART0 EVENT: 0x%04X\\n", event);}}int main(void) {UART0_Config_t config = {.baudrate = 9600, // Baud rate: 9600 bps.parity = UART_PARITY_NONE, // Parity: None.stopbits = UART_STOPBITS_1, // Number of stop bits: 1.bitmode = UART_BITMODE_8_N_1, // Data size: 8 bits, 1 stop bit};UART0_Start(&config);bool running = true;while (running) {uint8_t data;if (UART0_GetChar(&data)) {printf("%d\\n", data);} else {printf("Error reading data\\n");}}UART0_Stop(); // Stop UART communication to prevent overflow in event looprunning = false; // Set flag to false to exit the while loop and main functionreturn 0;}```这个简单的例程首先配置UART0模块,然后在一个无限循环中接收和发送数据。
linux c语言编写modbus rtu例程 -回复

linux c语言编写modbus rtu例程-回复如何使用C语言在Linux下编写Modbus RTU例程,以实现数据的读取和写入。
Modbus是一种通信协议,用于在工业自动化系统中实现设备之间的数据通信。
RTU是Modbus协议的一种传输格式,其中数据以二进制形式传输。
在Linux系统中,我们可以使用C语言来编写Modbus RTU例程。
下面将一步一步回答如何实现数据的读取和写入。
第一步:设置串口参数在Linux中,我们可以使用串口来与Modbus设备进行通信。
首先,我们需要设置串口的波特率、数据位、停止位和校验位。
这可以通过C语言中的termios库函数来实现。
c#include <termios.h>int set_serial_port(int fd, int baudrate) {struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, baudrate);cfsetospeed(&options, baudrate);options.c_cflag = (CLOCAL CREAD);options.c_cflag &= ~CSIZE;options.c_cflag = CS8;options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CRTSCTS;tcsetattr(fd, TCSANOW, &options);}以上代码中,`set_serial_port`函数用于设置串口参数。
`fd`参数为串口文件描述符,`baudrate`参数为波特率。
其中,`cfsetispeed`和`cfsetospeed`函数用于设置输入和输出速度,`CLOCAL`和`CREAD`标志用于使串口工作在本地模式和可读模式,`CS8`标志用于设置8位数据位,`PARENB`标志用于禁用奇偶校验,`CSTOPB`标志用于设置停止位为1位,`CRTSCTS`标志用于禁用硬件流控制。
基于C语言的RS232串口通信的设计

Wh e t h e r C o m 函数 、 O u t C o m 函数 、 R e c e i v e C o m 函数
进 行若 干字节 数 据 的发送 和 接 收 ,并 利 用 R e c e i v e 。 Da t a函数将 不 连续 的数 据包 进 行叠 加 , 形 成一 个 完 整 的数 据包 。
i m C h e c k P o r t ( u n s i g n e d i n t n R e s u l t )
Re c e i ve Da t a
i m Wh e t h e r Co m( i n t p o t r , b y t e d a t a )
Y
f 砀 e t he r Co m
Re c e i ve Co m
d a t a , i m p a r i t y , i n t s t o p ) / 指 定 的 串 口 p o r t ,波 特 率 b a u d , 数 据位 d a t a , 是 否校 验 p a r i y, t 停 止位 s t o p /
由p o r t 指 定 相 应 的 端 口 0表示 C OM1 , 1表 示 C OM2 , 以此 类推 。C md定 义如 表二 所示 。
表 二 Cmd定 义
2 . 3 通信函数的应用
函数 的实 现 流程 如 图一所 示 。通 过 I n i t i a l C o m 函数可 以方 便初 始 化 串行 接 口 , C h e c k P o r t 函数检 查
C o m、 检 测 串 口是 否 发 生错 误 函数 C h e c k P o r t 、 串口 是 否有 数 据 到达 函数 Wh e t h e r C o m、 向串 口发 送 一
c语言串口编程实例

c语言串口编程实例摘要:1.串口编程基础2.C 语言串口编程步骤3.C 语言串口编程实例4.实例详解5.总结正文:一、串口编程基础串口编程是指通过计算机串行接口进行数据通信的编程方式。
串口(Serial Port)是一种计算机硬件接口,可以通过串行通信传输数据。
与并行通信相比,串行通信只需一条数据线,传输速度较慢,但具有线路简单、成本低的优点。
因此,串口编程在电子设备、计算机外设、通信设备等领域有广泛的应用。
二、C 语言串口编程步骤1.包含头文件:在使用C 语言进行串口编程时,首先需要包含头文件`<reg52.h>`或`<intrins.h>`。
2.配置串口:配置串口包括设置波特率、数据位、停止位、奇偶校验等参数。
3.初始化串口:初始化串口主要是初始化串口硬件,如配置UART(通用异步收发器)等。
4.打开串口:打开串口是指使能串口通信功能,以便数据传输。
5.读写串口:通过`in`和`out`语句实现数据的输入输出。
6.关闭串口:在数据传输完成后,需要关闭串口以节省资源。
7.串口通信:通过循环寄存器、缓存寄存器或FIFO(先进先出)等方法实现数据的收发。
三、C 语言串口编程实例以下是一个简单的C 语言串口编程实例,该实例通过串口发送数据“Hello, World!”:```c#include <reg52.h>#include <intrins.h>sbit UART_TXD = P3^1; // 配置UART TXD 引脚void init_uart(); // 初始化UART 函数void send_data(unsigned char dat); // 发送数据函数void main(){init_uart(); // 初始化UARTsend_data("H"); // 发送字符"H"send_data("e"); // 发送字符"e"send_data("l"); // 发送字符"l"send_data("l"); // 发送字符"o"send_data(" "); // 发送空格send_data("W"); // 发送字符"W"send_data("o"); // 发送字符"r"send_data("r"); // 发送字符"l"send_data("d"); // 发送字符"d"while(1); // 循环等待}void init_uart() // 初始化UART 函数{TMOD = 0x20; // 设置定时器1 为工作状态TH1 = 0xfd; // 设置定时器1 的计数值TL1 = 0xfd; // 设置定时器1 的计数值TR1 = 1; // 使能定时器1SCON = 0x40; // 设置串口工作状态ES = 0; // 开总中断EA = 1; // 开总中断允许}void send_data(unsigned char dat) // 发送数据函数{SBUF = dat; // 将数据存入缓存寄存器while(!TI); // 等待发送缓存清空TI = 0; // 清空发送缓存}```四、实例详解1.配置串口:通过设置UART TXD 引脚为P3.1,确定波特率、数据位、停止位和奇偶校验等参数。
一个c语言的串口通信程序范例
#include 〈stdio.h>#include <dos。
h>#include <conio。
h〉#include <string。
h〉#define COM232 0x2f8#define COMINT 0x0b#define MaxBufLen 500#define Port8259 0x20#define EofInt 0x20static 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);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();maskb=inp(Port8259+1);if(IntVectNum==0x0c)outp(Port8259+1,maskb&0xef); else outp(Port8259+1,maskb&0xf7);}static void interrupt far AsyncInt(void){disable();if(CharsInBuf<MaxBufLen)Buffer[CircIn]=inp(comportaddr);if(CircIn〈MaxBufLen-1) CircIn++;else CircIn=0;if(CircIn==CircOut) CircOut++;else CharsInBuf++;enable();outp(Port8259,EofInt);}void Restore(void){setvect(intvectnum,OldAsyncInt);outp(Port8259+1,maskb);}int GetCharInBuf(unsigned char *Char)int Flag;Flag=—1;if(CharsInBuf>0){(*Char)=Buffer[CircOut];if(CircOut<MaxBufLen—1)CircOut++;else CircOut=0;CharsInBuf—-;Flag=0;}return Flag;}int SendChar(unsigned char Char){if((inp(comportaddr+5)&0x20)==0) return —1; outp(comportaddr,Char);return 0;}main(){int i,c;unsigned char InChar;Init_COM(COM232,COMINT,1200,8,1,0); while(1){if(kbhit()){if((InChar=getch())==27)break;else while(SendChar(InChar));}if(GetCharInBuf(&InChar)==0)printf("%c",InChar);}Restore();}。
模拟串口的三种方法及C语言
模拟串口的三种方法及C语言模拟串口是软件中模拟实现串口通信的一种方法,它是在电脑上通过软件模拟两个串口之间的传输,用来测试、调试串口相关的应用程序。
本文将介绍三种常见的模拟串口的方法,并提供C语言代码示例。
1.使用虚拟串口软件虚拟串口软件是一种用于模拟串口通信的应用程序。
它创建了虚拟的串口设备,使其在电脑上模拟出真实的串口通信环境。
通过虚拟串口软件,可以实现串口的模拟收发数据,可以连接到串口测试工具、串口调试工具或者自己编写的串口通信程序上。
以下是一个使用虚拟串口软件模拟串口通信的C语言代码示例:```c#include <stdio.h>#include <windows.h>int mai//打开虚拟串口//检测串口是否成功打开printf("Error in opening serial port\n");return 1;}//进行串口通信操作,如发送、接收数据//关闭串口return 0;```在这个示例中,我们使用了Windows操作系统的函数`CreateFile`来打开一个虚拟串口,这里的串口名称是"COM1"。
然后可以调用相关函数进行串口通信操作,最后用`CloseHandle`函数关闭串口。
2.使用串口驱动模拟在一些情况下,可以通过修改电脑的串口驱动程序来模拟串口通信。
这种方法需要更深入的了解操作系统的底层机制,并进行驱动程序的开发和修改。
通过修改串口驱动程序,可以模拟出一个虚拟的串口设备,通过这个设备进行串口通信。
以下是一个简单的C语言代码示例,用于修改串口驱动程序来模拟串口通信:```c#include <stdio.h>#include <fcntl.h>#include <unistd.h>int maiint fd;//打开串口设备fd = open("/dev/ttyS0", O_RDWR);//检测串口是否成功打开if (fd < 0)printf("Error in opening serial port\n");return 1;}//进行串口通信操作,如发送、接收数据//关闭串口设备close(fd);return 0;```在这个示例中,我们使用了Linux操作系统的函数`open`来打开一个串口设备,这里的设备名称是"/dev/ttyS0"。
C语言 做串口通讯程序
一、引言:现在在工业现场很少有人再用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 端口11 端口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;}port_status;/*发送一个字符*/port_status.status=bioscom(1,cc,port);printf("%c",cc); /*判断发送是否正确*/if(port_status.ch[1]&128){printf("Send data error detected in serial port"); printf("\r");}}/* Check-Status 检查端口*/int check_status(int port){int status;status=bioscom(3,0,port);if(status & 0x100)return 0;else return 1;}/*发送命令函数*/void SendOder(char od[]){int i=0;for(i=0;i<=16;i++)sendPort(PORT,od[i]);}/*应用程序主体*/main(){int key=1,i,m=1;int check=1;char a[20]="@00WR0000000144*"; /*启动00*/ char b[20]="@00WR0000000441*"; /*混料02*/ char c[20]="@00WR000000084D*"; /*出料03*/ char d[20]="@00WR0000000247*"; /*停止01*/ a[16]='\r';b[16]='\r';c[16]='\r';d[16]='\r';printf("启动:F1 \t混料:F2 \t出料:F3");printf(" \t停止:F4 \t退出:F5\n");bioscom(0,SETTINGS,PORT); /*初始化串口*/ while(check!=0) /*检查端口状态*/{m+=1;check=check_status(PORT);if(m>=1000)break;}while (1){while (bioskey(1)==0);key=bioskey(0);key=key&0xFF?0:key>>8;if(key==F1) /*启动命令*/{for(i=0;i<=16;i++){sendPort(PORT,a[i]);m=1;while(check!=0){m+=1;check=check_status(PORT); /*检查端口状态*/ if(m>=3000)break;}}}else if(key==F4) /*停止命令*/{for(i=0;i<=16;i++){sendPort(PORT,d[i]);m=1;while(check!=0){m+=1;check=check_status(PORT);if(m>=3000)break;}}}else if(key==F2) /*混料命令*/{for(i=0;i<=16;i++){sendPort(PORT,b[i]);m=1;while(check!=0){m+=1;check=check_status(PORT);if(m>=3000)break;}}}else if(key==F3) /*出料命令*/{for(i=0;i<=16;i++){sendPort(PORT,c[i]);m=1;while(check!=0){m+=1;check=check_status(PORT);if(m>=3000)break;}}}else if(key==F5)exit(1); /*退出命令*/}getch(); /* 此语句请不要删除*/}四、结束语RS232串口通讯在小型的控制系统同中还是应用广泛的,本文采用C语言控制,主要是给用户提供一个新的控制方式做选择。
[电子工程] 单片机C语言之串口通信协议(代码分享)
现实生活中,我们总是要与人打交道,互通有无。
单片机也一样,需要跟各种设备交互。
例如汽车的显示仪表需要知道汽车的转速及电动机的运行参数,那么显示仪表就需要从汽车的底层控制器取得数据。
而这个数据的获得过程就是一个通信过程。
类似的例子还有控制器通常是单片机或者PLC与变频器的通信。
通信的双方需要遵守一套既定的规则也称为协议,这就好比我们人之间的对话,需要在双方都遵守一套语言语法规则才有可能达成对话。
通信协议又分为硬件层协议和软件层协议。
硬件层协议主要规范了物理上的连线,传输电平信号及传输的秩序等硬件性质的内容。
常用的硬件协议有串口,IIC,SPI,RS485,CAN和USB。
软件层协议则更侧重上层应用的规范,比如modbus协议。
好了,那这里我们就着重介绍51单片机的串口通信协议,以下简称串口。
串口的6个特征如下。
(1)、物理上的连线至少3根,分别是Tx数据发送线,Rx数据接收线,GND共用地线。
(2)、0与1的约定。
RS232电平,约定﹣5V至﹣25V之间的电压信号为1,﹢5V至﹢25V之间的电压信号为0 。
TTL电平,约定5V的电压信号为1,0V电压信号为0 。
CMOS电平,约定3.3V的电压信号为1,0V电压信号为0 。
其中,CMOS电平一般用于ARM芯片中。
(3)、发送秩序。
低位先发。
(4)、波特率。
收发双方共同约定的一个数据位(0或1)在数据传输线上维持的时间。
也可理解为每秒可以传输的位数。
常用的波特率有300bit/s, 600bit/s, 2400bit/s, 4800bit/s, 9600bit/s。
(5)、通信的起始信号。
发送方在没有发送数据时,应该将Tx置1 。
当需发送时,先将Tx置0,并且保持1位的时间。
接受方不断地侦测Rx,如果发现Rx常时间变高后,突然被拉低(置为0),则视为发送方将要发送数据,迅速启动自己的定时器,从而保证了收发双方定时器同步定时。
(6)、停止信号。
发送方发送完最后一个有效位时,必须再将Tx保持1位的时间,即为停止位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
outp(Port8259,EofInt); }
void Restore(void) {
setvect(intvectnum,OldAsyncInt); outp(Port8259+1,maskb); } int GetCharInBuf(unsigned char *Char) { int Flag;
Flag=-1;
if(CharsInBuf>0) {
(*Char)=Buffer[CircOut]; if(CircOut<MaxBufLen-1)CircOut++; else CircOut=0; CharsInBuf--; Flag=0; } return Flag; }
int SendChar(unsigned char Char) {
disable(); OldAsyncInt=getvect( IntVectNum ); setvect( IntVectNum, AsyncInt ); enable();
maskb=inp(Port8259+1); if(IntVectNum==0x0c)outp(Port8259+1,maskb&0xef); else outp(Port8259+1,maskb&0xf7); }
outportb(portaddr+MCR,0); outportb(IMASKREG,inportb(IMASKREG)|(1<<portf)); enable(); setvect(portf+8,vect_com); }; void Getportaddr(int port) {
static void interrupt far AsyncInt(void) {
disable();
if(CharsInBuf<MaxBufLen) Buffer[CircIn]=inp(comportaddr); if(CircIn<MaxBufLen-1) CircIn++; else CircIn=0; if(CircIn==CircOut) CircOut++; else CharsInBuf++; enable();
if(kbhit()) {if((InChar=getch())==27)break; else while(SendChar(InChar0)
printf("%c",InChar); } Restore(); }
接收程序: #include <dos.h> #include <fstream.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define RXD 0 //接收 #define TXD 0 //发送 #define LSB 0 //波特率调节低 8 位 #define MSB 1 //波特率调节高 8 位 #define IER 1 // 中断起用寄存器 #define IIR 2 //中断标识寄存器 #define LCR 3 //线路控制寄存器 #define MCR 4 //调制解调器控制寄存器 #define LSR 5 //线路状态寄存器 #define MSR 6 //调制解调器状态寄存器 #define IERV 1 #define OUT2 0x08 #define ERTS 2 #define EDTR 1 #define EMPTY 0X20 #define READY 0X30 #define ICREG 0X20 #define IMASKREG 0X21 #define EOI 0X20 #define WAITCOUNT 5000 #define BUFFLEN 2048 //用于存储字符的数组的界 #define ALTE 0X12 #define ALTQ 0X10 #define SER_BAUD_1200 96 #define SER_BAUD_2400 48 #define SER_BAUD_9600 0x0C #define SER_BAUD_19200 6 #define SER_STOP_1 0 /*/ 1 stop bit per character*/ #define SER_STOP_2 4 /*/ 2 stop bits per character*/ #define SER_BITS_5 0 /*/ send 5 bit characters*/
一个 c 语言的串口通信程序范例
标签: 分类: 技术笔记
c 语言
串口通信
通信程序
it
最近接触一个项目,用 HL-C1C 激光位移传感器+易控组态软件完成生产线高度跳 变检测,好久没有接触 c c#,一些资料,找来做个记录,也许大家用的着
#include <stdio.h> #include <dos.h> #include <conio.h> #include <string.h>
{ 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);
}; /*unsigned char sender( unsigned char ch) { outportb(portaddr2+TXD,ch); printf("\nsender outportdata=%c\n",ch); outcount++; return(1); }; */ void interrupt receiver(...) { unsigned char ch; ch=inportb(portaddr+RXD); putb(ch); incount++; //记录接收了多少个数据。 outportb(ICREG,EOI); }; void SerInit(int baud,int configuration) { disable(); outportb(portaddr+LCR,0x80); outportb(portaddr+LSB,baud); outportb(portaddr+MSB,0x00); outportb(portaddr+LCR,configuration); enable(); }; void SerOpen(void) { vect_com=getvect(portf+8); disable(); inportb(portaddr+RXD); inportb(portaddr+MSR); inportb(portaddr+LSR); inportb(portaddr+IIR); outportb(portaddr+IER,IERV); outportb(portaddr+MCR,OUT2|ERTS|EDTR); outportb(IMASKREG,inportb(IMASKREG)&(~(1<<portf))); setvect(portf+8,receiver); enable(); }; void SerClose(void) { disable(); outportb(portaddr+IER,0);
#define COM232 0x2f8 #define COMINT 0x0b
#define MaxBufLen #define Port8259 #define EofInt
500 0x20 0x20
static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut;
buffin=0; if(buffin!=buffout)
{buffer[buffin]=ch; // printf("bufferin[%d]=%c",buffer[buffin]); // getch(); } else buffin=temp; }; unsigned char getb()//read a char from the recvbuf { if(buffout!=buffin) { if(++buffout==BUFFLEN) buffout=0; //printf("bufferout[%d]=%c",buffout,buffer[buffout]); return(buffer[buffout]); } else return(0xff);
#define SER_BITS_6 1 /*/ send 6 bit characters*/ #define SER_BITS_7 2 /*/ send 7 bit characters*/ #define SER_BITS_8 3 /*/ send 8 bit characters*/ #define SER_PARITY_NONE 0 /*/ no parity*/ #define SER_PARITY_ODD 8 /*/ odd parity*/ #define SER_PARITY_EVEN 24 /*/ even parity*/ int port; int ComNum; unsigned portaddr; unsigned portf; unsigned int baudtable[]={0x180,0xc0,0x60,0x30,0x18,0x0c,0x06}; unsigned char paritytable[]={0x08,0x18,0x00,0x28,0x38}; unsigned char buffer[BUFFLEN];//recv buf int buffin=0; int buffout=0; int incount=0; int outcount=0; void interrupt(*vect_com)(...); void putb(unsigned char ch)//write a char to the recvbuf 将中断得到的数据写 到缓冲区 { int temp; temp=buffin; if(++buffin==BUFFLEN)