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









