搜档网
当前位置:搜档网 › C语言串口通信源代码

C语言串口通信源代码

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);

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

Buffer[CircIn]=inp(comportaddr);

if(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

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();

}

接收程序:

#include

#include

#include

#include

#include

#include #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*/ #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)

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);

};

/*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<

setvect(portf+8,receiver);

enable();

};

void SerClose(void)

{

disable();

outportb(portaddr+IER,0);

outportb(portaddr+MCR,0);

outportb(IMASKREG,inportb(IMASKREG)|(1<

enable();

setvect(portf+8,vect_com);

};

void Getportaddr(int port)

{

switch (port)

{

case 0: portaddr=0x3F8; break;

case 1: portaddr=0x2F8; break;

case 2: portaddr=0x3E8; break;

case 3: portaddr=0x2E8; break;

}

portf=(port==0)?4:3;

};

void Int()

{

unsigned char key,key2;

port=ComNum-1;

if(peek(0x40,port*2)==0)

{

printf("have no special com .\n");

exit(1);

}

else

{ printf("The used port is :COM%d\n",ComNum);

};

Getportaddr(port); // 得到串口地址SerInit(SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS_8 | SER_STOP_1); //初始化串口,设置波特率等

SerOpen();

do

{

if(kbhit())

{

key2=getch();

if(key2==27){ break;}

};

key=getb();

if(key!=0xff)

{

printf("%x\t",key);

FILE *fp;

fp=fopen("C:\\Receivedata.dat","ab"); //可选择接收数据的存放文件路径和文件名

if(fp==NULL) printf(" error!");

// fputc(key,fp);

fwrite(&key,sizeof(unsigned char),1,fp);

fclose(fp);

}

}while (key2!=27);

SerClose();

// printf("%d char has been received\n",incount);

// printf("%d char has been sended\n",outcount);

// printf("\nsum=%d \n",sum);

}

void main()//com1 receive

{ printf("Please input the receive COMnum:(1~4)\n");

cin>>ComNum; printf("the current com set is:9600,even, data bits 8, stop 1,");

Int();

printf("\n\nOVER\n");

exit(0);

}; ---------------发送文件程序

#include

#include

#include

#include

#include

#include

#ifdef __cplusplus

#define __CPPARGS ...

#else

#define __CPPARGS

#endif

#define SER_RBF 0

#define SER_THR 0

#define SER_IER 1

#define SER_IIR 2

#define SER_LCR 3

#define SER_MCR 4

#define SER_LSR 5

#define SER_MSR 6

#define SER_DLL 0

#define SER_DLH 1

#define SER_BAUD_1200 96

#define SER_BAUD_2400 48

#define SER_BAUD_9600 12

#define SER_BAUD_19200 6

#define SER_GP02 8

#define COM_1 0x3F8 #define COM_2 0x2F8 /*/ base port address of port 1*/

#define COM_3 0x3E8

#define COM_4 0x2E8 #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*/ #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*/ #define SER_DIV_LATCH_ON 128 /*/ used to turn reg 0,1 into divisor latch*/ #define PIC_IMR 0x21 /*/ pic's interrupt mask reg.*/ #define PIC_ICR 0x20 /*/ pic's interupt control reg.*/ #define INT_SER_PORT_0 0x0C /*/ port 0 interrupt com 1 & 3*/ #define INT_SER_PORT_1 0x0B /*/ port 0 interrupt com 2 & 4*/ #define SERIAL_BUFF_SIZE 128 /*/ current size of circulating receive buffer*/ void interrupt far (*Old_Isr)(__CPPARGS); /*/ holds old com port interrupt handler*/ char ser_buffer[SERIAL_BUFF_SIZE]; /*/ the receive buffer*/ int ser_end = -1,ser_start=-1; /*/ indexes into receive buffer*/ int ser_ch, char_ready=0; /*/ current character and ready flag*/ int old_int_mask; /*/ the old interrupt mask on the PIC*/ int open_port; /*/ the currently open port*/ int serial_lock = 0; /*/ serial ISR semaphore so the buffer*/ /*/ isn't altered will it is being written*/

/*/ to by the ISR*/ /*-------------写串口-----------------*/

void interrupt far Serial_Isr(__CPPARGS)

{

serial_lock = 1;

ser_ch = inp(open_port + SER_RBF);

if (++ser_end > SERIAL_BUFF_SIZE-1)

ser_end = 0;

ser_buffer[ser_end] = ser_ch;

++char_ready;

outp(PIC_ICR,0x20);

serial_lock = 0;

}

int Ready_Serial()

{

return(char_ready);

} /*--------------读串口--------------*/

int Serial_Read()

{

int ch;

while(serial_lock){}

if (ser_end != ser_start)

{

if (++ser_start > SERIAL_BUFF_SIZE-1)

ser_start = 0;

ch = ser_buffer[ser_start];

printf("%x",ch);

if (char_ready > 0)

--char_ready;

return(ch);

}

else

return(0);

} /*--------------写串口-----------------*/

Serial_Write(char ch)

{ while(!(inp(open_port + SER_LSR) & 0x20)){}

asm cli

outp(open_port + SER_THR, ch);

asm sti

} /*-----------初始化串口---------------*/ Open_Serial(int port_base, int baud, int configuration)

{

open_port = port_base;

disable();

outp(port_base + SER_LCR, SER_DIV_LATCH_ON);

outp(port_base + SER_DLL, baud);

outp(port_base + SER_DLH, 0);

outp(port_base + SER_LCR, configuration);

outp(port_base + SER_MCR, SER_GP02);

outp(port_base + SER_IER, 1);

if (port_base == COM_1 || port_base==COM_3)

{

Old_Isr = _dos_getvect(INT_SER_PORT_0);

_dos_setvect(INT_SER_PORT_0, Serial_Isr);

printf("\nOpening Communications Channel Com Port #1/3...\n");

}

else

{

Old_Isr = _dos_getvect(INT_SER_PORT_1);

_dos_setvect(INT_SER_PORT_1, Serial_Isr);

printf("\nOpening Communications Channel Com Port #2/4...\n");

}

old_int_mask = inp(PIC_IMR); outp(PIC_IMR, (port_base==COM_1) ? (old_int_mask & 0xEF) : (old_int_mask & 0xF7 ));

enable();

} /*-------------关闭串口--------------*/

Close_Serial(int port_base)

{

outp(port_base + SER_MCR, 0);

outp(port_base + SER_IER, 0);

outp(PIC_IMR, old_int_mask );

if (port_base == COM_1)

{

_dos_setvect(INT_SER_PORT_0, Old_Isr);

printf("\nClosing Communications Channel Com Port #1.\n");

}

else

{

_dos_setvect(INT_SER_PORT_1, Old_Isr);

printf("\nClosing Communications Channel Com Port #2.\n");

}

} /*-------------发送应用----------------*/

void main(int argc,char *argv[])

{

char ch,press;

int done=0;

FILE *fp;

argc=2;

//argv[1]="c:\\comfile.c";

if(argc<2)

{

printf("\nUsage:display !!!");

// exit(1);

}

if((fp=fopen(argv[1],"r+b"))==NULL)

{

printf("cannot open the file\n");

// exit(0);

}

fseek(fp, 0, SEEK_SET);

Open_Serial(COM_1,SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS_8 | SER_STOP_1);

printf("com:1;bps:9600;parity:even;bits:8;stop bit:1");

printf("press any key to begin sending");

getch();

//Serial_Write(''); //该语句可用于发送单个字符while(!done&&ch != EOF) //发送文件开始

{

ch = fgetc(fp);

//if(ch==EOF) Serial_Write(27);

Serial_Write(ch);

delay(30);

if (kbhit())

{

press=getch();

if (press==27)

{

Serial_Write(27);

done=1;

}

}

}

Close_Serial(COM_1);

fclose(fp);

}

下面介绍最重要的MFC:

CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都

是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。 CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)

CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的

选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。

CDialog对话框

CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。

CPen笔,画线

CBrush刷子,填充

CFont字体,控制文字输出的字体

CBitmap位图

CPalette调色板

CRgn区域,指定一块区域可以用于做特殊处理。

CFile文件。最重要的不外是Open(打开),Read(读入),Write(写)

CString字符串。封装了C中的字符数组,非常实用。

CPoint点,就是(x,y)对

CRect矩形,就是(left,top,right,bottom)CSize大小,就是(cx,cy)对(宽、高)

C语言串口通信助手代码

该程序全部由C写成没有C++ 更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include #include "resource.h" #include "MainDlg.h" #include #include #include HANDLE hComm;//用于获取串口打开函数的返回值(句柄或错误值)OVERLAPPED m_ov; COMSTAT comstat; DWORD m_dwCommEvents;

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语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用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); 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程序及应用实例

一、程序代码 #include//该头文件可到https://www.sodocs.net/doc/d817757691.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

c语言串口通信范例

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);

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); 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);

用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) //检测祯头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语言串口通信范例标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]

一个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; ?

串口通信linux c语言实现

/*write*/ #include #include #include #include #include #include #define MAX_SIZE 30 void set_speed(int,int); int main(int argc,char **argv) { int fd; int flag; int write_num=0; struct termios term; speed_t baud_rate_i; speed_t baud_rate_o; char buff[MAX_SIZE]="hello,beautiful day!"; fd=open(argv[1],O_RDWR|O_NONBLOCK); if(fd<0) printf("open the COM1 error!\n"); else printf("open COM1 ok!\n"); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); set_speed(fd,9600); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); while(1) { buff[29]='\n'; write_num=write(fd,buff,sizeof(buff));

C语言实现串口通信

摘要: 本文说明了异步串行通信(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语言串口通信范例

c语言串口通信范例 SANY GROUP system office room 【SANYUA16H-

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用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); 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);

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

#include #include #include #include #define uchar unsigned char #define uint unsigned int sbit 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;

用C语言实现串口通信

用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语言 做串口通讯程序

一、引言: 现在在工业现场很少有人再用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语言的串口通信程序例 标签: 分类:技术笔记 c语言 串口通信 通信程序 it 最近接触一个项目,用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;

c语言串口通信范例

一个c语言的串口通信程序范例 标签: 分类:技术笔记 c语言 串口通信 通信程序 it 最近接触一个项目,用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;

C语言实现串行通信接口程序

摘要本文说明了异步串行通信(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++更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include #include "resource.h" #include "MainDlg.h" #include #include #include HANDLE hComm;/用于获取串口打开函数的返回值(句柄或错误值) OVERLAPPED m_ov; COMSTAT comstat; DWORD m_dwCommEvents; 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, LPARAMlParam) { HWND hwndCombo1=GetDlgItem(hwnd,IDC_COMBO1); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM1")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM2")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM3")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM4")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM5")); ComboBox_SetCurSel(hwndCombo1,0); void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID,DWORD dwTime); SetTimer(hwnd,1,1000,TimerProc); return TRUE; } /* 监视串口错误时使用的函数*/ boolProcessErrorMessage(char* ErrorText) char *Temp = new char[200]; LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |

相关主题