用C语言编写串口程序

合集下载

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。

本文将介绍使用C语言编写51单片机的串口通信程序。

1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。

首先,我们需要一块51单片机开发板,内置了串口通信功能。

另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。

2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。

在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。

同时,我们还需要引入头文件来定义串口通信的相关寄存器。

3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。

这些参数的配置需要根据实际需要进行调整。

在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。

4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。

初始化串口的过程包括打开串口、设置中断等。

5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。

阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。

6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。

在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。

7. 中断处理在串口通信中,中断是一种常见的处理方式。

通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。

8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。

```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。

用C编写的RS232串口通信程序

用C编写的RS232串口通信程序

void main(){delayms(100);init(); //初始化系统delayms(100);init_wdt(); //初始化看门狗while(1){while(!RI_0) //是否收到数据{clr_wdt();}RI_0=0; //清除接收中断标志buffer=S0BUF;if(buffer==0x5a) //检测祯头0start0=1;if(buffer==0x54) //检测祯头1start1=1;if(buffer==0x5a) //检测祯尾0end0=1;if(buffer==0xfe) //检测祯尾1end1=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; //重填祯头0buff[count-4]=0; //校验和清零for(k=2;k<(count-4);k++) //计算校验和{buff[count-4]+=buff[k];}for(k=0;k<count;k++) //从祯头1开始循环发送{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<count;k++){buff[k]=0x00; //缓冲区清零}count=0; //计数清零}。

面就是用C语言编写控制串行口的程序.pdf

面就是用C语言编写控制串行口的程序.pdf
4
int 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);
2
一寸光阴不可轻
int 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;

c语言怎么写串口通信编程 -回复

c语言怎么写串口通信编程 -回复

c语言怎么写串口通信编程 -回复在C语言中进行串口通信编程,你需要了解串口的基本原理以及相关的函数和库。

串口通信是一种通过串行数据传输进行通信的方式,常用于嵌入式系统中与外部设备进行数据交互。

本文将以步骤的形式来介绍如何在C语言中进行串口通信编程。

步骤一:了解串口的基本原理在开始串口通信编程之前,你需要了解串口的基本原理。

串口是通过发送和接收数据位的序列来进行通信的。

串口通信需要考虑的一些参数包括波特率(即数据传输速率)、数据位数、校验位和停止位等。

波特率指的是每秒钟传输的位数,可以是常用的9600、19200、38400等。

步骤二:选择合适的串口库在C语言中,你可以选择使用合适的串口库来简化串口通信的编程工作。

常见的串口库包括Windows系统中的WinAPI、Linux系统中的termios库等。

选择库的时候,需根据你所使用的操作系统和开发环境进行选择。

步骤三:打开串口在开始使用串口进行通信之前,需要先打开串口。

使用串口库的函数,可以根据需要选择打开特定的串口,一般通过指定串口名称或者端口号来进行打开。

打开串口的函数可能返回一个文件描述符或者句柄,用于后续的读写操作。

步骤四:配置串口参数打开串口之后,需要进行串口参数的配置。

这包括波特率、数据位数、校验位和停止位等参数的设置。

一般通过调用相应的函数,将需要设置的参数传递给串口库,以完成参数的配置。

步骤五:读取串口数据配置完串口参数后,你可以开始读取串口数据。

通过调用读取函数,你可以从串口接收缓冲区中获取数据,并进一步进行处理。

读取函数可能会阻塞程序执行,直到有数据可读取为止。

步骤六:发送串口数据与读取串口数据相对应的是发送串口数据。

通过调用相应的发送函数,你可以将你要发送的数据写入串口发送缓冲区,等待发送。

发送函数可能会阻塞程序执行,直到数据成功发送。

步骤七:关闭串口在程序结束时,需要关闭已经打开的串口。

通过调用相应的函数,可以完成串口的关闭。

用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语言编写串口程序

串口通信之用C语言编写串口程序在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。

C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言的方便。

在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和状态信息。

这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。

为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)的数据,而另外半个字节(高4位)则用来传送信息。

我们可以对信息位(高4位)进行如下简单的编码:0H:发送的是新的半个字节数据1H:重新发送上次传送错误的数据2H:文件名结束3H:文件结束这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就是发送机发送过来的那个字节。

发送机接收到回送信号后,把它与刚发送的字节相比较,如果相同,就发送新的半个字节,否则就重新发送。

新数据与旧数据通过信息位来区分。

下面就是用C 语言编写控制串行口的程序。

#include "dos.h"#include "stdlib.h"#include "stdio.h"#define PORT 0void 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.");exit(1);}}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 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;char ch;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 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 语言程序

串口通信c 语言程序

串口通信c 语言程序#include "c8051f020.h"#include <intrins.h>/********函数声明********/void SYSCLK_Init (void); //*单片机时钟初始化void PORT_Init (void); // 初始化IO口void Uart0_Init(void); //串口0 初始化//**** 变量及I/O口定义*********unsigned char data aaa[5]_at_ 0x30;unsigned char data BBB[5]_at_ 0x40;unsigned char data EEE _at_ 0x50;int k;//*********单片机时钟初始化***********//void SYSCLK_Init (void){int i; // delay counterOSCXCN = 0x65; // start external oscillator with// 18.432MHz crystalfor (i=0; i < 256; i++) ; // Wait for osc. to start upwhile (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settleOSCICN = 0x88; // select external oscillator as SYSCLK// source and enable missing clock// detector}//***************//初始化IO口*************************//void PORT_Init (void){XBR0 = 0x07; // Enable SMBus, SPI0, and UART0XBR1= 0x02; //交叉开关允许XBR2 = 0x40; // Enable crossbar and weak P74OUT=0x04 ;pull-ups}//***************串口0 初始化**************//void Uart0_Init(void){TMOD = 0x20; // TMOD: 定时器1, 模式2, 8位重载SCON0 = 0x40; // SCON0: 模式1, 8位UART,PCON = 0x80; // SMOD00 = 1TH1= 0x70;TL1= 0x70;CKCON=0x10; // T1时钟为系统时钟12分频TR1=1; //计数器1开始计时, 打开串口Uart0 }//************主程序****************************//void main (void){WDTCN = 0xde;WDTCN = 0xad; //关看门狗SYSCLK_Init (); //初始化时钟PORT_Init (); //初始化IO口Uart0_Init(); //串口0 初始化aaa[0]=0x011;aaa[1]=0x022;aaa[2]=0x033;aaa[3]=0x044;aaa[4]=0x055;aaa[5]=0x066;P5=0x40;//485发送for(k=0;k<=5;k++){SBUF0=aaa[k];while(TI0!=1);TI0=0;}P5=0x0;//485接收REN0=1;for(k=0;k<=5;k++){while(RI0!=1);RI0=0;BBB[k]=SBUF0 ;}while(1) ;}。

VC实现串口通信项目源码

VC实现串口通信项目源码

VC实现串口通信项目源码以下是一个简单的VC实现串口通信项目的源码:```cpp#include <windows.h>#include <iostream>using namespace std;//定义串口类class SerialPortpublic:SerialPort(const char* portName)//打开串口hSerial = CreateFile(portName, GENERIC_READ , GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//检查串口是否成功打开if (hSerial == INVALID_HANDLE_VALUE)if (GetLastError( == ERROR_FILE_NOT_FOUND)cerr << "Error: " << portName << " 不存在" << endl;} elsecerr << "Error: 打开串口失败" << endl;}}//配置串口DCB dcbSerialParams = {0};dcbSerialParams.DCBlength = sizeof(dcbSerialParams);cerr << "Error: 获取串口配置信息失败" << endl;}dcbSerialParams.BaudRate = CBR_9600; // 设置波特率为9600dcbSerialParams.ByteSize = 8; // 设置数据位为8位dcbSerialParams.StopBits = ONESTOPBIT; // 设置停止位为1个dcbSerialParams.Parity = NOPARITY; // 设置奇偶校验方式为无校验cerr << "Error: 设置串口配置信息失败" << endl;}//配置读写操作的超时时间cerr << "Error: 设置串口超时时间失败" << endl;}}//读取串口数据int readData(char* buffer, int bufferSize)DWORD bytesRead;if (!ReadFile(hSerial, buffer, bufferSize, &bytesRead, NULL)) cerr << "Error: 读取串口数据失败" << endl;return -1;}return bytesRead;}//发送串口数据bool writeData(const char* buffer, int bufferSize)DWORD bytesWritten;if (!WriteFile(hSerial, buffer, bufferSize, &bytesWritten, NULL))cerr << "Error: 发送串口数据失败" << endl;return false;}return true;}//关闭串口void closePorCloseHandle(hSerial);}private:HANDLE hSerial;};int mai// 创建SerialPort对象,指定串口名称(根据实际情况修改)SerialPort serialPort("COM1");//读取串口数据char buffer[256];int bytesRead = serialPort.readData(buffer, sizeof(buffer)); if (bytesRead == -1)cerr << "Error: 读取串口数据失败" << endl;} elsecout << "读取到的数据: " << buffer << endl;}//发送串口数据const char* data = "Hello, Serial Port!";if (!serialPort.writeData(data, strlen(data)))cerr << "Error: 发送串口数据失败" << endl;} elsecout << "成功发送串口数据" << endl;}//关闭串口serialPort.closePort(;return 0;```上述代码实现了一个简单的串口通信项目,包括串口初始化、读取串口数据、发送串口数据和关闭串口的功能。

基于C语言的RS232串口通信的设计

基于C语言的RS232串口通信的设计

基于C语言的RS232串口通信的设计RS232是一种常见的串行通信接口,广泛用于计算机与外部设备之间的数据传输。

RS232串口通信涉及到多个方面的设计,包括串口参数设置、数据的发送与接收等。

本文将以C语言为基础,介绍如何设计一个基于RS232串口通信的程序。

接下来,我们需要编写数据发送和接收的函数。

数据的发送包括两个步骤:打开串口和发送数据。

首先,我们需要打开串口,并设置好相应的参数。

在C语言中,可以通过打开文件的方式来打开串口设备文件。

例如,可以使用`fopen(`函数打开串口设备文件:```FILE* serial_port = fopen("/dev/ttyS0", "w");if(serial_port == NULL)printf("Failed to open the serial port.\n");return -1;```然后,我们可以使用`fprintf(`函数将数据写入串口设备文件,实现数据的发送:```fprintf(serial_port, "Hello, RS232!\n");```数据的接收与数据的发送类似,也包括两个步骤:打开串口和接收数据。

我们仍然可以使用`fopen(`函数打开串口设备文件,并设置好相应的参数。

然后,可以使用`fgets(`函数从串口设备文件中读取数据:```char buffer[1024];fgets(buffer, sizeof(buffer), serial_port);printf("Received Data: %s", buffer);```需要注意的是,当数据到达串口时,我们需要设置好超时时间,以免数据接收阻塞程序执行。

在C语言中,可以通过设置串口设备文件的文件描述符来设置超时时间。

最后,我们需要在程序中循环调用数据发送和接收的函数,实现数据的循环传输。

串口vc编程步骤及程序

串口vc编程步骤及程序

1.添加C++类 CCESeries下面是CCESeries.h 文件的内容:#pragma once//定义串口接收数据函数类型//这是一个回调函数,执行该函数时,表示串口接收到了数据。

typedef void (CALLBACK* ONSERIESREAD)(void * pOwner /*父对象指针*/ ,BYTE* buf /*接收到的缓冲区*/,DWORD dwBufLen /*接收到的缓冲区长度*/);class CCESeries{public:CCESeries(void); //CCESeries类的构造函数~CCESeries(void); //CCESeries类的析构函数public://打开串口BOOL OpenPort(void* pOwner,/*指向父指针*/UINT portNo = 1, /*串口号*/UINT baud = 9600, /*波特率*/UINT parity = NOPARITY, /*奇偶校验*/UINT databits = 8, /*数据位*/UINT stopbits = 0 /*停止位*/);//关闭串口void ClosePort();//同步写入数据BOOL WriteSyncPort(const BYTE*buf , DWORD bufLen);//设置串口读取、写入超时BOOL SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts);//得到串口是否打开BOOL GetComOpened();private://串口读线程函数,该函数被定义成私有静态。

static DWORD WINAPI ReadThreadFunc(LPVOID lparam);private://关闭读线程,当使用完串口后,便调用这个函数退出串口数据接收线程。

void CloseReadThread();private://已打开的串口句柄// HANDLE m_hComm;//读线程句柄HANDLE m_hReadThread;//读线程ID标识DWORD m_dwReadThreadID;//读线程退出事件HANDLE m_hReadCloseEvent;BOOL m_bOpened; //串口是否打开void * m_pOwner; //指定父对象指针public:ONSERIESREAD m_OnSeriesRead; //串口读取回调函数HANDLE m_hComm;};2.下面是CCESeries.cpp文件的内容:#include "StdAfx.h"#include "CESeries.h"//构造函数,将m_hComm初始化为无效的句柄CCESeries::CCESeries(){//初始化内部变量m_hComm = INVALID_HANDLE_VALUE;m_OnSeriesRead = NULL;m_bOpened = 0;}//析构函数,检测如果串口是打开的,则关闭串口CCESeries::~CCESeries(){if (m_bOpened){//关闭串口ClosePort();}}//串口读线程函数,该线程用于异步接收串口数据。

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言)

#include <reg52.h>#include<intrins.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit Key1 = P2^3;sbit Key2 = P2^2;sbit Key3 = P2^1;sbit Key4 = P2^0;sbit BELL = P3^6;sbit CONNECT = P3^7;unsigned int Key1_flag = 0;unsigned int Key2_flag = 0;unsigned int Key3_flag = 0;unsigned int Key4_flag = 0;unsigned char b;unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00, 0x10,0x89};unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};unsigned char Disbuf[4];void delayms(uint t){uint i;while(t--){/* 对于11.0592M时钟,约延时1ms */for (i=0;i<125;i++){}}}//-----------------------------------------------------void SendData(uchar Dat){uchar i=0;SBUF = Dat;while (1){if(TI){TI=0;break;}}}void ScanKey(){if(Key1 == 0){delayms(100); if(Key1 == 0){Key1_flag = 1; Key2_flag = 0; Key3_flag = 0;Key4_flag = 0;Key1 = 1;}else;}if(Key2 == 0){delayms(100);if(Key2 == 0){Key2_flag = 1; Key1_flag = 0; Key3_flag = 0;Key4_flag = 0;Key2 = 1;}else;}if(Key3 == 0){delayms(50);if(Key3 == 0){Key3_flag = 1; Key1_flag = 0; Key2_flag = 0;Key4_flag = 0;Key3 = 1;}else;}if(Key4 == 0){delayms(50);if(Key4 == 0){Key4_flag = 1;Key1_flag = 0;Key2_flag = 0;Key3_flag = 0;Key4 = 1;}else;}else;}void KeyProc(){if(Key1_flag){TR1 = 1;SendData(0x55);Key1_flag = 0; }else if(Key2_flag){TR1 = 1;SendData(0x11); Key2_flag = 0;}else if(Key3_flag) {P1=0xff;BELL = 0;CONNECT = 1;Key3_flag = 0;}else if(Key4_flag){CONNECT = 0;BELL = 1;Key4_flag = 0;}else;}void Initdisplay(void){Disbuf[0] = 1;Disbuf[1] = 2;Disbuf[2] = 3;Disbuf[3] = 4;}void Display() //显示{unsigned int i = 0;unsigned int temp,count;temp = Disdigit[count]; P2 =temp;temp = Disbuf[count];temp = Num[temp];P0 =temp;count++;if (count==4)count=0;}void time0() interrupt 1 using 2 {Display();TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;}void main(){Initdisplay();TMOD = 0x21;TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;TR0 = 1;ET0 = 1;TH1 = 0xFD; //11.0592MTL1 = 0xFD;PCON&=0x80;TR1 = 1;ET1 = 1;SCON = 0x40; //串口方式REN = 1;PT1 = 0;PT0 = 1;EA = 1;while(1){ScanKey();KeyProc();if(RI){Disbuf[0] = 0;Disbuf[1] = 20;Disbuf[2] = SBUF>>4;Disbuf[3] = SBUF&0x0f;RI = 0;}else;}}51单片机串口通信C语言程序2**************************************************************; 平凡单片机工作室;ckss.asm;功能:反复向主机送AA和55两个数;主机使用一个串口调试软件设置19200,n,8,1***************************************************************/#include "reg51.h"#define uchar unsigned char#define uint unsigned int//延时程序//////////////////由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;i<124;i++){;}}}//////////////////// 主程序////////////////////void main(){ uchar OutDat; //定义输出变量TMOD=0x20; //TMOD=0TH1=0xf3; //12MHZ ,BPS:4800,N,8,1TL1=0xf3;PCON=0x80; //方式一TR1=1; //?????????????????????????????SCON=0x40; //串口通信控制寄存器模式一OutDat=0xaa; //向串口发送固定数据值for(;;) //循环程序{SBUF=OutDat;//发送数据for(;;){ if(TI) //发送中断位当发送停止位时置1,表示发送完成break;}mDelay(500);TI=0; //清零中断位OutDat=~OutDat; //显示内容按位取反}}。

c语言串口编程实例

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语言

模拟串口的三种方法及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语言    做串口通讯程序

一、引言:现在在工业现场很少有人再用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语言的串口通信程序范例

一个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语言怎么写串口通信编程串口通信是一种广泛应用于嵌入式系统和电子设备之间的通信方式。

无论是嵌入式开发还是电子设备控制,串口通信都是常见的需求。

在C语言中,实现串口通信需要通过操作串口的硬件寄存器和使用相应的通信协议来实现数据的发送和接收。

本文将一步一步介绍如何使用C语言编写串口通信程序。

第一步:打开串口要开始串口通信,首先需要打开串口。

在C语言中,可以使用文件操作函数来打开串口设备。

通常,串口设备被命名为/dev/ttyS0,/dev/ttyS1等,具体名称取决于系统。

下面是一个打开串口设备的示例代码:cinclude <stdio.h>include <fcntl.h>include <termios.h>int open_serial_port(const char *port) {int fd = open(port, O_RDWR O_NOCTTYO_NDELAY);if (fd == -1) {perror("open_serial_port");return -1;}设置串口属性struct termios options;tcgetattr(fd, &options);cfmakeraw(&options);cfsetspeed(&options, B9600);tcsetattr(fd, TCSANOW, &options);return fd;}int main() {const char *port = "/dev/ttyS0";int fd = open_serial_port(port);if (fd == -1) {打开串口失败,处理错误return -1;}串口已打开,可以进行数据的读写操作return 0;}在上面的代码中,open_serial_port函数用于打开指定的串口设备并进行一些必要的设置。

使用c语言编写串口读写程序

使用c语言编写串口读写程序

使用c语言编写串口读写程序标题:深入理解使用C语言编写串口读写程序摘要:本文将深入探讨使用C语言编写串口读写程序的多方面内容,从简介和基础知识开始,逐步展开到高级技术和应用示例。

我们将解释串口通信的原理,介绍C语言中串口读写函数的使用方法,并提供实用的代码示例和调试技巧。

通过阅读本文,您将能够全面理解如何使用C语言编写高质量且可靠的串口读写程序。

1. 引言通过串口通信,我们可以在计算机和外部设备之间进行可靠的数据传输。

在这一章节,我们将简要介绍串口通信的基本原理和特点。

2. 基础知识在了解串口通信的基础知识之前,我们将先讨论C语言中的基本I/O操作和串口通信相关的接口。

您将学习如何打开串口、设置串口参数并进行数据读写操作。

3. 串口读写函数本章节将详细介绍在C语言中使用串口读写函数进行数据收发的方法。

我们将重点关注常用的读写函数,并深入探讨它们的使用及注意事项。

4. 实用示例通过实用示例,我们将展示如何在C语言中编写具有实际功能的串口读写程序。

您将学习如何与外部设备进行通信,并处理收到的数据。

5. 调试技巧在本章节中,我们将分享一些常见的调试技巧和方法,以帮助您在编写串口读写程序时更高效地进行故障排除和问题解决。

6. 总结在本文的最后一节,我们将总结所学内容,并回顾关键点。

同时,我们将分享自己对串口读写程序的理解和观点,以提供更多的启示和思考。

总结:本文通过深入探讨使用C语言编写串口读写程序的相关知识,帮助读者全面理解串口通信的原理和实践。

您将学习如何在C语言中使用串口读写函数进行数据收发,并通过实用示例和调试技巧提升编程能力。

同时,我们分享了对串口读写程序的个人观点和理解,以帮助您在实际应用中更加灵活和创新地运用这些知识。

面就是用C语言编写控制串行口的程序

面就是用C语言编写控制串行口的程序

面就是用C语言编写控制串行口的程序。

#include "dos.h"#include "stdlib.h"#include "stdio.h"#define PORT 0void 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最简单易懂的串口读写入门程序

using System;
using;
using ;
using ;
using ;
using WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort sp = null;
private void button1_Click(object sender, EventArgs e)
{
sp = new SerialPort();
=
"COM1";然后查看设备治
理,可见,已为咱们创建好了两个串口,而且已把两串口连接
再打开串口调试程序sscom32
在那个地址需要说明一下,因为咱们的程序是固定打开com1的,因此串口调试程序打开的串口必需是com2,如
上图
运行咱们的程序,点击“打开com1”,输入发送内容,点button2,能够在串口调试程序里观看到收到的内容;反过来,从串口调试程序发送内容,然后再咱们的程序里点button3,能够看到程序接收到的内容。

这大体上是一个最简单的读写串口的程序,中间完全没有对数据结构和异样的处置(比如说咱们输入中文),只能完成读和写操作。

希望以上内容能解决一些串口初学者的入门疑惑。

SerialPort读写串口方式:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用C语言编写串口程序在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。

C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言的方便。

在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和状态信息。

这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。

为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)的数据,而另外半个字节(高4位)则用来传送信息。

我们可以对信息位(高4位)进行如下简单的编码:0H:发送的是新的半个字节数据1H:重新发送上次传送错误的数据2H:文件名结束3H:文件结束这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就是发送机发送过来的那个字节。

发送机接收到回送信号后,把它与刚发送的字节相比较,如果相同,就发送新的半个字节,否则就重新发送。

新数据与旧数据通过信息位来区分。

下面就是用C语言编写控制串行口的程序。

#include "dos.h"#include "stdlib.h"#include "stdio.h"#define PORT 0void 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."); exit(1);}}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 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;char ch;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 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,&#174;,&#174;);}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,&#174;,&#174;);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,&#174;,&#174;);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,&#174;,&#174;);return reg.x.ax;}以上程序可传送各种格式的文件,也有一定的自动纠错能力,但对于异常情况的处理能力比较弱,读者可以自己改进。

由于篇幅限制,对于中断14H的功能、入口参数及返回参数的意义请读者自己查有关资料。

**********************************附录:现在大多数串行口都遵循RS-232标准,以下是最常用的RS-232信号:名称针号含义RTS4Request to send(请求发送)CTS5Clear to send(清除发送)DSR6Data set ready(数据设备准备好)DTR20 Data terminal ready(数据终端准备好)TXD2Transmit data(发送数据)RXD3Receive data(接收数据)GRD7Ground(接地)。

相关文档
最新文档