史上最简单的串口上位机代码(基于turbo c&dos)
第二版在3楼#include <dos.h>
void setcom()
{
outportb(0x3fb,0x80);
outportb(0x3f8,0x0c);
outportb(0x3f9,0x00); //9600为0x000c(115200/speed)
outportb(0x3fb,0x03);
outportb(0x3fc,0x03);
outportb(0x3f9,0x00);
}
char getc()
{
return (char)inportb(0x3f8);
}
void printc(char c)
{
outportb (0x3f8,(int)c);
}
void main(void)
{
setcom();
printf("hello world!\r\n");
while(1)
{ if(kbhit())
{
printc(getch());
}
if(!(inportb(0x3fd)&0x01))continue;
printf("%c",getc());
}
}
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_688586MV4CK9.jpg
(原文件名:QQ截图20111025191915.jpg)
下位机是最近还没昨晚的fat32文件系统,上位机不支持中文,设置为com1和9600,8位无校验。 楼主强人 mark下! 晚上稍微改了一下,支持com1-4,9600和115200速度(速度的话大家自己加上switch代码就可以了)
新的版本加入了通讯缓冲(不过在实际应用中看不出效果来)
用法 com com_numberspeed
example : com com1 9600
PS:以前错误处理都是return就行,这回怎么不输出调试信息了呢?
/*version 0.1*/
#include <dos.h>
#include <string.h>
#define com1base 0x3f8
#define com2base 0x2f8
#define com3base 0x3e8
#define com4base 0x2e8
#define buff_reg 0x00
#define speed_reg_low 0x00
#define speed_reg_hight 0x01
#define int_enable_reg 0x01
#define int_identity_reg 0x02
#define com_ctrl_reg 0x03
#define modem_ctrl_reg 0x04
#define com_status_reg 0x05
#define modem_status_reg 0x06
char rev_buff;
void setcom(int combase,int speed)
{
outportb((combase+com_ctrl_reg),0x80);
outportb((combase+speed_reg_low),(115200/speed));
outportb((combase+speed_reg_hight),(115200%speed));
outportb((combase+com_ctrl_reg),0x03);
outportb((combase+modem_ctrl_reg),0x03);
outportb((combase+int_enable_reg),0x00);
}
char getc(int combase)
{
return (char)inportb(combase);
}
void printc(int combase,char c)
{
outportb (combase,(int)c);
}
void main(int argc,char *argv[])
{
int combase;
int speed;
int cont;
int position;
printf("Terminal for DOS\r\n --by hzr0071 ^_^\r\n");
if(argc!=3)
{
printf("Please set the port's number and speed like:com.exe com1 9600 and press the ENTER \r\n");
return;
}
if(strcmp(argv,"com1")==0)combase=com1base;
else if(strcmp(argv,"com2")==0)combase=com2base;
else if(strcmp(argv,"com3")==0)combase=com3base;
else if(strcmp(argv,"com4")==0)combase=com4base;
else
{
printf("please check port number\r\n");
return;
}
if(strcmp(argv,"9600")==0)speed=9600;
else if(strcmp(argv,"115200")==0)speed=115200;
else
{printf("please check the speed");
return;
}
printf("%s%s\r\n",argv,argv);
setcom(combase,speed);
cont=0;
position=0;
while(1)
{
cont++;
if(cont==9)
{
cont=0;
rev_buff=0;
if(position!=0)
{
printf("%s",rev_buff);
position=0;
}
}
if(kbhit())
{
printc(combase,getch());
}
if(!(inportb(combase+com_status_reg)&0x01))continue;
rev_buff=getc(combase);
}
} mark 上位机是什么系统啊?
按道理,从XP之后的系统就不支持直接端口读写了,除非另外有驱动支持。 太帅了; 牛人太多了; 我也要努力学习了; 有点意思 mark 楼主厉害。。。 真不错,有空弄一下
页:
[1]