串口一例

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

请教如何用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);
};

QT开发串口程序一例 手把手教你编写一个简单的点灯上位机程序,虽然实现的功能很简单,但是QT上位机开发的步骤很详细,通过这个基础实例把这些套路摸透,我们就可以接着进行后续更多QT程序地开发学习 阅读详情

相关推荐

Linux下串口通信详解(上)打开串口串口初始化详解

linux下串口通信主要有下面几个步骤 串口通信流程图 下面我会一一介绍这几个步骤。 1.打开串口 代码(串口为ttyUSB0) //打开串口 int open_port(void) { int fd; fd=open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NONBLOCK); // printf("fd=%d\n",fd);

specialshoot的博客 9万+

串口操作一例

一.引子   这是一个硬件设备通过串口与一个程序工具通信的例子,通过这个工具,可以将设备中储存的一些数据导出为TXT文档。再通过其它系统将这个TXT文件导入到应用的系统中。二.相关效果图      三.源代码  using System;using System.Collections.Generic;using System.ComponentModel;

686

ros串口通讯(读取串口数据)

ros串口通讯是非常重要的通讯手段,通常跟下位机或者各种usb口外设都是通过串口进行通讯的。 那么我们跟着教程来学习一下如何读取手机通过无线串口发送给电脑的数据。 这里我通过一个usb-ttl工具将蓝牙连接到电脑上,然后通过手机连接蓝牙给蓝牙发送数据,然后电脑从usb-ttl工具读取数据并显示。 1.首先,ros里面有相应的串口包给我们用。我们调用串口包编程会非常方便。下载串口库: sudo apt-get install ros-melodic-serial 我的ros版本是melodic,如果

qqliuzhitong的博客 1万+

一例串口输出异常问题

最近碰到一个console口调试问题,串口输出数据后,到最后迟迟不出现命令提示符,后来发现用的TTL线有这个问题,换成232正常。

zhaogaojian的专栏 461

一例python实现的基于事件响应方式的串口封装

暂时只实现串口,socket(tcp/udp), http等其他方式的后续加上 CommBase.py # -*- coding: utf-8 -*- ''' Created on 2019��5��21�� @author: fredl ''' class CommBase(object): ''' classdocs ''' def __init__(s...

weixin_44245551的博客 2325

串口通信编程一例

医院新进一台生化分析仪,这台机器可以通过串口和电脑连接,化验结果可以通过串口传到电脑进行处理。 厂家提供了电脑端的软件,经过测试,软件可以接收到化验数据,但打印格式并不符合医院的要求,更重要的是,软件没有数据导出功能,化验结果...

csdn1995的博客 186

一例串口收发数据问题

最近在调试一个设备时,发现部分数据会丢失,排除程序代码问题后,问题就出现在一个232转485转换器上了,操作系统win10串口设置:波特率9600 n 8 1 这款转换器厂家是波仕卡,不知道是不是正品,整个一批都存在这个问题,安装最新驱动也不行,换了一个不知名的小厂设备反而正常。 ...

zhaogaojian的专栏 59

笔记本USB转串口要求指定COM1端口号一例

问题描述: 用户使用笔记本电脑连接串口工控设备,由于笔记本本身没有串口,只能通过转接实现。用户使用的是市场常见的USB转串口接头,连接后操作系统默认的是COM4(或其他),但该设备要求必须使用COM1口,如何修改? 解决方案: 以下以力特(Z-TEK)USB2.0转串口转接头(型号ZK-U03-2A)为例进行操作: 1、按照要求安装转接头驱动程序,在“设备管理器/端口”下,可以发现一个

cools1860的专栏 3296

串口上位机模拟OLED屏

这个例程,就是将前面的串口多byte串口通信和这个结和起来了,设计难点在上位机的编写,对上位机感兴趣的可以多了解一下,不感兴趣的可以参考一下,例如说,将IIC模块上包一个串口模块,就可以将IIC接口变为串口了,就可以通过串口来配置OLED了。添加过后,会在OLED预览区域中进行显示。等编辑好之后,就可以点击执行,这时候,上位机会解析这部分的数据,然后通过串口发送给FPGA,接下来的就是FPGA里面的处理了。例如字体的大小可调,字体可选,圆的线宽可调,像其他图形矩形,椭圆,线等等,都是可以的。

ic2121的博客 228

(转)使用HMC接管通过串口或显卡安装的分区操作系统

使用HMC接管通过串口或显卡安装的分区操作系统 原文:http://m.blog.itpub.net/23135684/viewspace-1062084/ 这是一个真实的案例,客户有一台P550的服务器,最开始使用串口的方式安装的操作系统,随着时间的推移和HMC的发展,客户想将这台服务器接入HMC,从而更方便的管理和维护,HMC接管该服务器的过程并不是我想象的那么简单。 首先要明白一个知...

weixin_30551947的博客 350

Ubuntu关于串口的操作(查看串口信息、串口助手、串口权限)

一、查看本机串口信息 1. 串口是否在使用 串口在 /dev 目录中,查看串口是否在使用,可以用命令 ls -l /dev/ttyUSB0 说明: ls -l:是查看目录的命令,直接用ls或ll也可以。 ttyUSB0:是串口名,一般都是tty开头,根据连接设备不同,有的串口名为 ttyS0 ,有的为ttyACM0,后面的0是串口号,按照你的需要改。 结果: 如果在使用会显示串口文件信息 没有...

淋曦的进击手记 6万+

【Iot】什么是串口?什么是串口通信?串口通信(串口通讯)原理,常见的串口通信方式有哪些?

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。 串口可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。串口通信(Serial Communications)是串口按位(bit)发送和接收字节的通信方式,它是嵌入式物联网领域中常用的通讯方式。 典型的串口通信使用3根线完成,分别是发送、接收、地线。 由于串口通信是异步的,所以端口能够在

余浩的博客 2万+

关于STC8单片机串口1、串口2、串口3、串口4的配置

串口1初始化配置: void Uart1Init(void) // 9600bps@12.000MHz { SCON = 0x50; // 8位数据,可变波特率 AUXR |= 0x40; // 定时器1时钟为Fosc,即1T AUXR &= 0xFE; // 串口1选择定时器1为波特率发生器 TMOD &= 0x0F; // 设定定时器1为16位自动重装方式 ...

weixin_43915898的博客 2万+

USB转串口那些事儿—USB转串口工作原理及应用

USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。 USB虚拟串口应用特点: USB应用广泛,支持热插拔,传输速度快。 仿真标准串口,用于升级原串口设备,或通过USB增加额外串口串口应用程序完全兼容,无需修改。 支持各类操作系统,如:Windows/Linux/Android/macOS。 二、工作原理 USB主机检测到USB转串口设备插入后,首先会对设备复...

PC小能手的博客 4万+

Windows使用串口API函数串口编程

Windows基于串口API函数的串口程序开发介绍欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导...

PC小能手的博客 1万+

STM32F103系列基于HAL库的串口通信(串口串口中断,串口DMA)

本文章讲述的是STM32F103系列基于HAL库开发的串口通信,包含普通串口串口中断以及串口DMA,感兴趣的可以好好看看。本次实验用到的模块有:STM32C8T6系统板,0.96寸OLED屏幕以及HC-08蓝牙模块普通串口接收(HAL_UART_Receive)简单介绍:`HAL_UART_Receive`是 STM32 HAL 库中用于 UART 数据接收的阻塞函数。它接收指定数量的字节,并将数据存储到指定的缓冲区中。该函数会一直等待,直到数据接收完成或超时,因此会阻塞程序的执行。

2402_84111511的博客 1658

串口通讯编程示例之串口完整代码

串口通讯编程示例之串口完整代码

2301_76587520的博客 2513

USB转串口与虚拟串口相关

不是原创,网上查询整理。 目录 一、串口与并口 二、USB转串口、虚拟串口概念 三、串口占用问题 四、其他:多个程序共享一个串口数据 五、COM、COM+和DCOM与COM端口无关 一、串口与并口 (一)串行接口(即COM口): 简称串口,也称串行通信接口。按电气标准及协议来分包括RS-232-C、RS-422、RS485、USB、TTL等。 RS-232-C、RS-422...

bluewater的专栏 1万+
上一篇: C++的风格与技巧
下一篇: c++试题(17)
manplus
博客等级 码龄22年 6粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值