搜索
bottom↓
回复: 10

史上最简单的串口上位机代码(基于turbo c&dos)

[复制链接]

出0入0汤圆

发表于 2011-10-25 19:20:37 | 显示全部楼层 |阅读模式
第二版在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());
               
        }
               
        }

(原文件名:QQ截图20111025191915.jpg)

下位机是最近还没昨晚的fat32文件系统,上位机不支持中文,设置为com1和9600,8位无校验。

出0入0汤圆

发表于 2011-10-25 20:25:13 | 显示全部楼层
楼主强人

出0入0汤圆

发表于 2011-10-25 21:17:48 | 显示全部楼层
mark下!

出0入0汤圆

 楼主| 发表于 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);


        }

        }

出0入0汤圆

发表于 2011-11-2 19:40:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-2 21:53:19 | 显示全部楼层
上位机是什么系统啊?
按道理,从XP之后的系统就不支持直接端口读写了,除非另外有驱动支持。

出0入0汤圆

发表于 2011-11-5 14:32:34 | 显示全部楼层
太帅了; 牛人太多了; 我也要努力学习了;

出0入0汤圆

发表于 2011-11-5 17:31:06 | 显示全部楼层
有点意思

出0入0汤圆

发表于 2011-11-17 16:39:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-26 10:10:26 | 显示全部楼层
楼主厉害。。。

出0入0汤圆

发表于 2012-9-10 23:07:21 | 显示全部楼层
真不错,有空弄一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 11:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表