C语言的串口操作
一个月前电脑主板烧了。。。。。n久没来论坛了。这次我又要来发问了。
今天在看一些用C操作的串口程序,大多数是C#和C++,用这个入门级别的C的没有。
而且代码大都年代久远,可能与编译器有关,可能与操作系统有关(我64bit win7)。所有的代码编译后数不清的error。
用C操作串口,会用到几个头文件吧<dos.h>、<conio.h>、<bios.h>。我用的是Pelles C(X64)没这几个头文件,网上下下来也不会用。
大神能不能给一个思路啊。怎么用C操作串口,用串口发送/接收16进制数据。
我这里有一个源代码,但是我用Pellse C编译,N个错误。
程序代码:
#include <stdio.h> #include "dos.h" #include "conio.h" #define BUFFLEN 1024 void InitCOM();/* 初始化串口 */ void OpenPort();/* 打开串口 */ void ClosePort();/* 关闭串口,释放串口资源 */ void interrupt asyncint();/* 新的中断函数 */ void interrupt(*asyncoldvect)();/* 中断向量:用于保护中断现场 */ unsigned char Buffer[BUFFLEN]; int buffin = 0; int buffout = 0; void OpenPort() { unsigned char ucTemp; InitCOM(); asyncoldvect = getvect(0x0c); disable(); inportb(0x3f8); inportb(0x3fe); inportb(0x3fb); inportb(0x3fa); outportb(0x3fc, 0x08|0x0b); outportb(0x3f9, 0x01); ucTemp = inportb(0x21)&0xef; outport(0x21, ucTemp); setvect(0x0c, asyncint); enable(); } void interrupt asyncint() { Buffer[buffin++] = inportb(0x3f8); if(buffin >= BUFFLEN) buffin = 0; outportb(0x20, 0x20); } void ClosePort(void) { disable(); outportb(0x3f9, 0x00); outportb(0x3fc, 0x00); outportb(0x21, inportb(0x21)&0x10); enable(); setvect(0x0c, asyncoldvect); } void InitCOM() { outportb(0x3fb, 0x80); outportb(0x3f8, 0x0c);/* 波特率设置为9600 */ outportb(0x3f9, 0x00); outportb(0x3fb, 0x03); outportb(0x3fc, 0x08|0x0b); outportb(0x3f9, 0x01); } unsigned char read_char(void) { unsigned unch; if(buffout != buffin) { unch = Buffer[buffout]; buffout++; if(buffout >= BUFFLEN) buffout = 0; return(unch); } else return(0xff); } void send_char(unsigned char unch) { while(((inp(0x3f8+5)) & 0x40) ==0); outportb(0x3f8, unch); } void main() { unsigned char unChar; short bExit_Flag = 0; OpenPort(); fprintf(stdout, "\n\nReady to Receive DATA\n" "Press [SEC] to quit...\n\n"); do { if(kbhit()) { unChar = getch(); switch(unChar) { case 0x1b: bExit_Flag = 1; break; } if(!bExit_Flag) send_char(unChar); } unChar = read_char(); if(unChar!= 0xff) { fprintf(stdout,"%c", unChar); } }while(!bExit_Flag); ClosePort(); }