串口一例_manplus的博客-程序员秘密

技术标签: delay  file  null  COM口操作  buffer  terminal  signal  

请教如何用pc104实现波特率为115200,端口为com2程序,要求用tc3。0,实施同步数据接受、显示和保存为文件。急!谢谢

我用bc3.1试过的。
#include   <dos.h>
#include   <iostream.h>
#include   <conio.h>
#include   <stdio.h>
#include   <stdlib.h>
#define   RXD   0
#define   TXD   0
#define   LSB   0
#define   MSB   1
#define   IER   1
#define   IIR   2
#define   LCR   3
#define   MCR   4
#define   LSR   5
#define   MSR   6
#define   IERV   1
#define   OUT2   0x08
#define   ERTS   2
#define   EDTR   1
#define   EMPTY   0X20
#define   READY   0X30
#define   ICREG   0X20
#define   IMASKREG   0X21
#define   EOI   0X20
#define   WAITCOUNT   5000
#define   BUFFLEN   2048
#define   ALTE   0X12
#define   ALTQ   0X10
int   port;
unsigned   portaddr;
unsigned   portf;
unsigned   int   baudtable[]={0x180,0xc0,0x60,0x30,0x18,0x0c,0x06};
unsigned   char   paritytable[]={0x08,0x18,0x00,0x28,0x38};
unsigned   char   buffer[BUFFLEN];//recv   buf
int   buffin=0;
int   buffout=0;
int   incount=0;
int   outcount=0;
void   interrupt(*vect_com)(...);
void   putb(unsigned   char   ch)//write   a   char   to   the   recvbuf
{
int   temp;
temp=buffin;
if(++buffin==BUFFLEN)
buffin=0;
if(buffin!=buffout)
buffer[buffin]=ch;
else
buffin=temp;
};
unsigned   char   getb()//read   a   char   from   the   recvbuf
{
if(buffout!=buffin)
{
if(++buffout==BUFFLEN)
buffout=0;
return(buffer[buffout]);
}
else
return(0xff);
};
unsigned   char   sender(unsigned   char   ch)
{
/*
int   wait=0;
//get   the   line   ready   signal
for(wait=0;wait<WAITCOUNT;wait++)
if((inportb(portaddr+MSR)&READY)==READY)
break;
if(wait==WAITCOUNT)
return(0);
*/
while(!(inportb(portaddr+LSR)&EMPTY));//get   the   place   ready   signal
outportb(portaddr+TXD,ch);
outcount++;
return(1);
};
void   interrupt   receiver(...)
{
unsigned   char   ch;
ch=inportb(portaddr+RXD);
putb(ch);
incount++;
outportb(ICREG,EOI);
};
void   SerInit(int   baud,int   datab,int   stopb,int   parity)
{
unsigned   char   lcr;
disable();
outportb(portaddr+LCR,0x80);
outportb(portaddr+LSB,baudtable[--baud]&0xFF);
outportb(portaddr+MSB,baudtable[baud]>>8);
lcr=paritytable[--parity];
lcr|=datab-5;
lcr|=(stopb-1)<<1;
outportb(portaddr+LCR,lcr);
enable();
};
void   SerOpen(void)
{
vect_com=getvect(portf+8);
disable();
inportb(portaddr+RXD);
inportb(portaddr+MSR);
inportb(portaddr+LSR);
inportb(portaddr+IIR);
outportb(portaddr+IER,IERV);
outportb(portaddr+MCR,OUT2|ERTS|EDTR);
outportb(IMASKREG,inportb(IMASKREG)&(~(1<<portf)));
setvect(portf+8,receiver);
enable();
};
void   SerClose(void)
{
disable();
outportb(portaddr+IER,0);
outportb(portaddr+MCR,0);
outportb(IMASKREG,inportb(IMASKREG)|(1<<portf));
enable();
setvect(portf+8,vect_com);
};
void   Getportaddr(int   port)
{
portaddr=peek(0X40,port*2);
portf=(port==0)?4:3;
};
void   CmdLineHelp()
{
printf("usage:   TERMINAL   com   baud   datab   stopb   parity/n");
printf("com:   1=COM1,2=COM2/n");
printf("baud:   1=300bps,2=600bps,3=1200bps,4=2400bps,5=4800bps,6=9600bps,7=19Kbps/n");
printf("datab(data   bits):5,6,7,8/n");
printf("stopb(stop   bits):1,2/n");
printf("parity:1=odd,2=even,3=none,4=mark,5=space/n/n");
};
int   CheckArgv(int   port,int   baud,int   datab,int   stopb,int     parity)
{
if(port<1||port>2)
return(1);
if(baud<1||baud>7)
return(1);
if(datab<5||datab>8)
return(1);
if(stopb<1||stopb>2)
return(1);
if(parity<1||parity>5)
return(1);
return(0);
};
void   main(int     argc,char   *argv[])
{
unsigned   char   key;
char   echoflag=0;
if(argc<6)
{
printf("指定的参数个数不正确./n");
CmdLineHelp();
exit(1);
};
if(CheckArgv(atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5])))
{
printf("命令行参数不正确./n");
CmdLineHelp();
exit(1);
};
port=atoi(argv[1])-1;
if(peek(0x40,port*2)==0)
{
printf("无指定的串行口./n");
CmdLineHelp();
exit(1);
};
Getportaddr(port);
SerInit(atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5]));
SerOpen();
printf("ALT+E   显示开/关   ALT+Q   结束/n");
printf("OK/n");
while(1)
{
if(kbhit())
{
key=getch();
if(!key)
{
key=getch();
if(key==ALTE)
echoflag=~echoflag;
if(key==ALTQ)
break;
}
else
{
if(echoflag)
putch(key);
if(!sender(key))
printf("(Time   out!)");
};
};
key=getb();
if(key!=0xff)
putch(key);
if(key=='!'&&argc>=7)
{
FILE   *thandle;
printf("/nbegin   to   send     file   %s/n",argv[6]);
if((thandle=fopen(argv[6],"rb"))!=NULL)
{
int   mychar;
fseek(thandle,0,SEEK_SET);
while((mychar=fgetc(thandle))!=EOF)
{
                                                                                delay(1);
if(echoflag)
putch(mychar);
if(!sender(mychar))
printf("(Time   out!)");
}
}
fclose(thandle);
}
};
SerClose();
printf("%d   char   has   been   received/n",incount);
printf("%d   char   has   been   sended/n",outcount);
printf("/n/nOVER/n");
exit(0);
};

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/manplus/article/details/608841

智能推荐

剑指offer | 面试题47:礼物的最大价值_剑指offer47_程序员大航子的博客-程序员秘密

转载本文章请标明作者和出处本文出自《Darwin的程序空间》本文题目和部分解题思路来源自《剑指offer》第二版开始行动,你已经成功一半了,献给正在奋斗的我们题目在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多...

使用MySQLWorkBench绘制ER图详解_一个很酷的人的博客-程序员秘密

数据库设计工具MySQLWorkBench·该工具为MySQL官方提供地址:http://dev.mysql.com/downloads/workbench/小伙伴们注意按自己的操作系统选择下载版本。·注意事项:安装后将环境语言配置成简体中文,否则中文乱码工作步骤新建模型后,会进入此

python摄像头识别快递单号查询_Python快递鸟API接口对接(即时查询|物流跟踪|电子面单|单号识别)..._weixin_39892447的博客-程序员秘密

快递鸟 kdniao python sdk, with tornado async &amp; asyncio http client support. https://github.com/menduo/kdniao_pythonkdniao_python快递鸟 kdniao python sdk, with tornado async http client support.2.获取开发者账号...

Spark面试题(二)_spark 数据的精度被控制在允许的误差范围内的技术栈组件_大数据技术派的博客-程序员秘密

本文首发于我的个人博客:Spark面试题(二)1、Spark有哪两种算子?Transformation(转化)算子和Action(执行)算子。2、Spark有哪些聚合类的算子,我们应该尽量避免什么类型的算子?在我们的开发过程中,能避免则尽可能避免使用reduceByKey、join、distinct、repartition等会进行shuffle的算子,尽量使用map类的非shuffle算子。这样的话,没有shuffle操作或者仅有较少shuffle操作的Spark作业,可以大大减少性能开销。.

机器学习学习日志_熵_水野与小太郎的博客-程序员秘密

信息熵1、信息量是度量 信息的单位2、信息的信息量的大小与 事件发生的概率相关:比如你想要得到(中国男足失利)这条信息,这条信息的信息量可以看做很小,因为你心里默认这是必然的,你学不到任何知识;相反的,如果你得到的是(中国男足夺冠)这条信息,这条信息的信息量将会很大,你就会点击相应的连接去了解(你的价值观都被颠覆了)3、设一条信息的信息量为 I(x),两条信息的信息量为 I(x)+I...

Ubuntu18.04系统下CUDA9.0+cuDNN+Anaconda3+Pytorch的安装与配置_ubuntu18.04安装anaconda3+ cuda9.0_Dr. Ning的博客-程序员秘密

一 安装CUDA 9.0博主的电脑是64位的,显卡为GTX950m,系统是Ubuntu 18.04。目前NVIDIA最新版本的显卡驱动为422.50,对于Linux系统,CUDA9.0支持的最低版本的显卡驱动为384。我的笔记本显卡硬件比较旧,最新版本的驱动会出现兼容性问题。综合各方面考虑,我选择安装384版本的显卡驱动,保证了兼容性的同时,也支持CUDA9.0。系统...

随便推点

关于bootstrap-table-tree封装_哈里哈气的博客-程序员秘密

(function ($) { 'use strict'; var sprintf = function (str) { var args = arguments, flag = true, i = 1; str = str.replace(/%s/g, function () {

ONL/Debian 和 Ubuntu 版本的对应关系_筋斗云计算的博客-程序员秘密

1991年8月25日,Linus在网络上发布了Linux内核的源代码。1994年3月14日发布了1.0版本。而Debian 系统于1993年8月16日由一名美国普渡大学学生伊恩·默多克(Ian Murdock)首次发布。古语云“龙生九子,各有不同” 。Debian 比作龙的话,最出名的儿子是Ubuntu (生于2004年), 它还有一个年轻儿子是ONL(2014年出生)。Ubuntu 和 ...

python删除符合条件的行_Pandas怎样按条件删除行?_weixin_39700625的博客-程序员秘密

To directly answer this question's original title "How to delete rows from a pandas DataFrame based on a conditional expression" (which I understand is not necessarily the OP's problem but could help ...

(十二)洞悉linux下的Netfilter&iptables:iptables命令行工具源码解析【下】_struct task_struct的博客-程序员秘密

iptables用户空间和内核空间的交互iptables目前已经支持IPv4和IPv6两个版本了,因此它在实现上也需要同时兼容这两个版本。iptables-1.4.0在这方面做了很好的设计,主要是由libiptc库来实现。libiptc是iptables control library的简称,是Netfilter的一个编程接口,通常被用来显示、操作(查询、修改、添加和删除)netfilter的

java 键盘循环输入_JAVA怎么实现循环输入_Lucky喵喵的博客-程序员秘密

展开全部JAVA实现循环输入的方法(拿学生成绩举例):1、e69da5e6ba9062616964757a686964616f31333365643662Java语言从键盘输入一个整型:importjava.util.Scanner;publicclassTest{publicstaticvoidmain(Stringargs[]){Scannerin=newScanner(...

Gitlab之合并分支_被gitlab还原的合并如何在合上去_confusingbird的博客-程序员秘密

一、发起合并申请(release/v1.5.0-&gt;master)。。。二、无冲突-&gt;成功;有冲突-&gt;如下解决(只能代码合并了)首先下载master源码git clone http://...cd project_dir # 进入路径git fetch origin # 将master远程最新代码更新到本地git checkout -b 'release/v1.5.0' 'origin/release/v1.5.0' #

推荐文章

热门文章

相关标签