|
楼主 |
发表于 2011-10-25 23:20:21
|
显示全部楼层
晚上稍微改了一下,支持com1-4,9600和115200速度(速度的话大家自己加上switch代码就可以了)
新的版本加入了通讯缓冲(不过在实际应用中看不出效果来)
用法 com com_number speed
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[10];
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[1],"com1")==0)combase=com1base;
else if(strcmp(argv[1],"com2")==0)combase=com2base;
else if(strcmp(argv[1],"com3")==0)combase=com3base;
else if(strcmp(argv[1],"com4")==0)combase=com4base;
else
{
printf("please check port number\r\n");
return;
}
if(strcmp(argv[2],"9600")==0)speed=9600;
else if(strcmp(argv[2],"115200")==0)speed=115200;
else
{printf("please check the speed");
return;
}
printf("%s %s\r\n",argv[1],argv[2]);
setcom(combase,speed);
cont=0;
position=0;
while(1)
{
cont++;
if(cont==9)
{
cont=0;
rev_buff[position]=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[position++]=getc(combase);
}
} |
|