hzr0071 发表于 2011-10-25 19:20:37

史上最简单的串口上位机代码(基于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位无校验。

Dalong357 发表于 2011-10-25 20:25:13

楼主强人

283868130 发表于 2011-10-25 21:17:48

mark下!

hzr0071 发表于 2011-10-25 23:20:21

晚上稍微改了一下,支持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);


        }

        }

yunduanmanbu06 发表于 2011-11-2 19:40:59

mark

dgjmwn 发表于 2011-11-2 21:53:19

上位机是什么系统啊?
按道理,从XP之后的系统就不支持直接端口读写了,除非另外有驱动支持。

qq502835899 发表于 2011-11-5 14:32:34

太帅了; 牛人太多了; 我也要努力学习了;

stm8s 发表于 2011-11-5 17:31:06

有点意思

ideality0214 发表于 2011-11-17 16:39:57

mark

noodlest 发表于 2011-11-26 10:10:26

楼主厉害。。。

avrydy 发表于 2012-9-10 23:07:21

真不错,有空弄一下
页: [1]
查看完整版本: 史上最简单的串口上位机代码(基于turbo c&dos)