导航:首页 > 编程语言 > visualc串口通信编程

visualc串口通信编程

发布时间:2022-04-27 19:35:55

㈠ 是用Visual c++开发串口通信程序还是用C++开发串口通信程序

VC++包含windows的API
可以很方便调用win驱动 访问串口
所以 用VC多一些

其实 用C或者C++都可以 是否使用VC作为IDE一样不重要
不管是什么IDE 用什么语言 ,都可以开发串口的。

㈡ 用vc++实现usb接口通信编程的一般步骤

我来说下我做过的USB通信,我没有做过DSP跟上位机的通信,我只做过ARM类的STM32跟上位机的数据传递,虽然做过但是也不是很 懂,只是略知一二,我来说说我怎么做的吧,我是这么实现的:
USB是个很复杂的协议,你如果完全搞懂,我估计没有几个月专心钻研是不行的,但是如果只是能实现你的这个功能,我估计不是很复杂。
首先来说说USB通信:
USB通信传输方式分为四种:控制,中断,批量,同步传输四种,这个你可以看看网上资料,然后我用STM32通信,因为数据量不是很大,我用的是中断传输方式,但是DSP数据量应该会比较大,不知道中断传输行不行,但是一般问题不大。
传输方式说完了,再说说USB设备类型,你每次插usb设备到电脑上的时候就会有提示,这是一个什么设备,USB设备类型就是说的这个意思,是鼠标还是键盘还是别的什么的,如果你选用标准的类,你就不用自己写上位机(PC)的驱动程序,但是如果不用标准的类,就是用自定义的类就要自己写上层的设备驱动程序,就是所谓的DDK,WDM,WDF什么的,你没写过这方面的还真有点棘手,但是也不一定要写驱动程序,你可以试试有个类叫HID类,这个类在USB通信的时候用的还挺多的,不过这个类也有缺点,这个地方还要说一点,USB还分低速,全速,高速三种,不太了解DSP,不知道他支持什么模式,但是USB2.0的全速应该至少可以支持的。
USB2.0全速模式HID用中断方式每秒最多可以传输64KB的数据,不知道能不能达到你的要求,但是我估计一般问题不大了,如果你这歀DSP能支持高速模式,每秒用这种方式可以传输高达22MB的数据,这个速度一般问题不大了。
你可以照着我说的思路,去网上搜搜人家写好的程序,肯定有人做过DSP的USB通信,然后你按照自己的要求改一改,主要应该是USB的设备描述符部分要自己修改,然后可能还要根据自己的电路改改配置什么的,上位机软件网上有源代码的多的是,然后自己摸索摸索,我估计你要是编程水平还可以的话,只是摸索USB,一两个星期完全没有问题,祝你好运!

㈢ visual c++ 串口编程 初学,求救

给你点代码
void Com::init_com_interface()
{
hcom = CreateFile("COM1", // communication port string (COMX)
GENERIC_READ | GENERIC_WRITE, // read/write types
0, // comm devices must be opened with exclusive access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // Async I/O
NULL); // template must be 0 for comm devices

DCB dcb;
COMMTIMEOUTS tout;
GetCommState(hcom,&dcb);
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(hcom,&dcb);

tout.ReadTotalTimeoutConstant = 0;
tout.WriteTotalTimeoutConstant = 0;
tout.WriteTotalTimeoutMultiplier = 0;
tout.ReadTotalTimeoutMultiplier = 0;
tout.ReadIntervalTimeout = -1;

SetCommTimeouts(hcom,&tout);

//DWORD len;
//if (!ReadFile(hcom,rxbuf,200,&len,NULL))
//{
// return FALSE;
//}
//else return TRUE;

}
以上是串口初始化代码
以下是发送字符串代码
void Com::SendCommand(CString str)
{
CString m_vHexshow="";

//mm[1]=100;
// m_vStaticFasong=str;
// m_vEditJieshou="";
// UpdateData(FALSE);

str.MakeLower();
int m=0,n=0,mn=0;
for(int i=0;i<str.GetLength();i+=3)
{
m=(str[i]<58)?(str[i]-48):(str[i]-87);
n=(str[i+1]<58)?(str[i+1]-48):(str[i+1]-87);
mn=m*16+n;
//if(mn==239)
//
m_vHexshow+= char(mn);
}

//
//if (m_vHexshow[0]==-17)

memcpy(txbuf,m_vHexshow,m_vHexshow.GetLength());
//if (txbuf[0]==239)

DWORD len;
if (!WriteFile(hcom,txbuf,m_vHexshow.GetLength(),&len,NULL))
{
}
}

㈣ 用visual c 6.0实现串口数据收发及采集数据的波形显示

给现金差不多。否则没人会帮你做。
如果让我来,我会用Labview做。一个小时就做好。初学者1星期搞定。
建议使用Labview吧,电驴上有的是下载。

㈤ c++ 编写串口通信程序

c++ 编写串口通信程序

推荐 看书
Visual C++_Turbo C串口通信编程实践

㈥ Visual C++串口通信技术详解的目录

前言
第一篇 基础理论和基本方法
第1章 串口通信理论基础
1.1 接口技术
1.1.1 接口的定义
1.1.2 接口的基本功能
1.1.3 接口的基本控制方式
1.1.4 并行接口技术
1.1.5 串行接口技术
1.2 RS-232C标准
1.2.1 RS-232C电气特性
1.2.2 RS-232C连接器机械特性
1.2.3 RS-232C的接口信号
1.2.4 RS-232C的通信方式
1.3 RS-422/RS-485标准
1.3.1 RS-422简介
1.3.2 RS-485简介
1.3.3 RS-422/RS-485网络安装注意点
1.4 SPI总线标准
1.4.1 SPI总线原理
1.4.2 SPI总线特点
1.5 USB总线标准
1.5.1 USB总线总体结构
1.5.2 USB数据传输逻辑结构
1.5.3 传输类型
1.6 使用串口通信的典型外设
1.6.1 Modem
1.6.2 传真机
1.6.3 GPS接收机
1.7 实践拓展
第2章 Visual C++集成开发环境简介
2.1 面向对象程序设计与C++语言
2.1.1 面向对象程序设计概述
2.1.2 C++语言基础
2.1.3 C++的面向对象特性
2.2 Visual C++6.0集成开发环境
2.2.1 visual C++6.0开发环境
2.2.2 项目与项目工作区
2.2.3 应用程序向导App Wizard
2.2.4 集成开发基本操作
2.2.5 联机帮助文件
2.3 MFC应用程序的创建
2.4 实践拓展
第3章 MSComm控件串口编程
3.1 MSComm控件简介
3.1.1 MSComm控件描述
3.1.2 MsComm控件常用属性
3.1.3 MSComm控件其他属性
3.1.4 MSComm控件的事件
3.2 MSComm控件编程步骤
3.2.1 加载MSComm控件到项目
3.2.2 初始化并打开串行端口
3.2.3 捕获串行端口事件
3.2.4 串行端口数据读写
3.2.5 关闭串行端口
3.2.6 程序发布问题
3.3 使用MsComm控件实现串口通信接收
3.4 实践拓展
第4章 Windows API串口编程
4.1 windows API串行编程概述
4.1.1 串行编程的数据结构
4.1.2 串行编程的Win32API函数
4.2 win32 API串口通信编程方式
4.2.1 打开串行端口
4.2.2 配置串行端口
4.2.3 读写串行端口
4.2.4 关闭串行端口
4.3 基于win32API函数实现串口通信发送程序
4.4 实践拓展
第5章 TAPI串口编程
5.1 TAPI概述
5.1.1 TAPI的含义
5.1.2 TAPI的体系结构
5.1.3 TAPI的服务类型
5.2 windows TAPI 2.x函数集
5.2.1 Windows TAPI编程流程
5.2.2 TAPI 2.x常用函数
5.3 使用TAPI实现电话拨打程序
5.4 实践拓展
第二篇 串口编程基础应用
第6章 串口实现双机互连
6.1 概述
6.2 通信协议及实现方案
6.2.1 异步串行通信
6.2.2 同步串行通信
6.3 实现代码分析
6.3.1 程序主体设计及关键模块分析
6.3.2 使用API通信
6.4 实践拓展
第7章 串口调试精灵
7.1 串口调试工具实现的基本要求
7.2 串口调试精灵的编程实现
7.2.1 软件功能及流程设计
7.2.2 程序界面分析
7.2.3 编程实现
7.2.4 使用测试
7.3 实践拓展
第8章 串口控制Modem设备
8.1 Modem接口
8.1.1 Modem简介
8.1.2 Modem工作流程
8.1.3 Modem通信方案
8.2 AT指令简介
8.2.1 Modem工作状态
8.2.2 AT指令集
8.3 使用Modem实现远程通信
8.3.1 使用单片机和Modem通信
8.3.2 使用PC和Modem通信
8.4 实践拓展
第9章 串口控制单片机
9.1 串口通信硬件设计
9.1.1 MCS.5 1系列单片机的串口原理
9.1.2 常用的接口芯片介绍
9.1.3 接口电路设计
9.2 串口通信参数设置
9.2.1 波特率设置
9.2.2 奇偶校验位的使用方法
9.2.3 通信协议约定
9.3 系统总体设计
9.4 单片机的串口编程方法
9.5 计算机端通信界面设计
9.6 计算机端程序设计
9.6.1 头文件引用及变量声明
9.6.2 控件加载及控件属性设置
9.6.3 发出读数据请求
9.6.4 接收数据的处理
9.6.5 关闭串口
9.7 实践拓展
第10章 串口控制PLC
10.1 PLC概述
10.1.1 PLC基本结构
10.1.2 PLC串行接口规范
10.1.3 通信协议
10.2 PLC串口通信
10.2.1 计算机与PLC之间的通信流程
10.2.2 PLC通信编程
10.3 实现代码分析
10.3.1 界面设计
10.3.2 程序设计核心代码
10.4 实践拓展
第11章 串口控制射频卡
11.1 射频卡概述
11.1.1 射频卡原理
11.1.2 射频卡分类及应用
11.1.3 典型射频卡模块
11.2 射频卡应用设计
11.2.1 读写器设计
11.2.2 基于射频卡模块的设计
11.3 实现代码分析
11.3.1 界面设计
11.3.2 串口通信程序设计
11.4 实践拓展
第12章 串口控制GPS模块
12.1 GPS系统的基础知识
12.1.1 GPS定位原理
12.1.2 GPS系统
12.2 LEA-4H型GPS模块的性能及其应用
12.3 NMEA-0183协议分析
12.3.1 NMEA-0183协议的定义
12.3.2 NMEA-0183数据信息
12.4 主机与GPS模块串口通信的程序实现
12.4.1 MSComm控件属性
12.4.2 添加MSComm控件
12.4.3 添加串口事件消息处理函数OnComm()
12.4.4 数据的接收与提取
12.4.5 实验结果及数据的显示
12.5 实践拓展
第三篇 串口编程高级应用
第13章 串口控制云台摄像头
13.1 云台摄像头
13.1.1 云台简介
13.1.2 摄像头及控制电路
13.2 云台控制协议
13.3 控制程序分析
13.3.1 添加控件
13.3.2 设置界面
13.3.3 主控程序
13.3.4 初始化
13.3.5 配置按钮
13.3.6 通信参数的设置
13.3.7 云台控制命令
13.3.8 旋转控制按钮和镜头控制按钮
13.4 实践拓展
第14章 智能报警系统
14.1 系统描述
14.2 系统分析与设计
14.3 关键技术
14.3.1 建立安防信息数据库
14.3.2 端口设置和定时读取I/O端口数据
14.3.3 判断是否有触发事件
14.3.4 启动并口控制的报警设备
14.3.5 根据设置拨打报警电话
14.3.6 安防日志管理
14.3.7 I/O端口通信
14.4 实现代码分析
14.4.1 创建项目
14.4.2 界面设计与实现
14.4.3 加入数据库支持
14.4.4 关键程序类的实现
14.5 实践拓展
第15章 语音自动应答系统
15.1 功能描述
15.1.1 TAPI介绍
15.1.2 功能介绍
15.1.3 实验要求
15.2 设计流程实现
15.2.1 程序设计流程图
15.2.2 TAPI 3.0方法介绍
15.2.3 串处理分析介绍
15.3 具体功能实现
15.3.1 程序主界面
15.3.2 参数配置
15.3.3 选择语音界面
15.4 实践拓展
第16章 USB转RS-232串口实例
16.1 USB总线技术简介
16.1.1 USB的特点
16.1.2 USB的体系结构
16.1.3 USB的电气特性
16.1.4 USB的数据通信协议
16.2 功能描述
16.3 USB总线转换芯片CH341简介
16.3.1 CH341异步串口工作方式
16.3.2 CH341功能配置
16.4 USB转RS-232桥接器硬件设计
16.5 驱动程序安装
16.6 实践拓展
附录 Modem AT命令集
参考文献

㈦ VC串口通信问题

串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。

无论那种操作方式,一般都通过四个步骤来完成:
(1) 打开串口
(2) 配置串口
(3) 读写串口
(4) 关闭串口

(1) 打开串口

Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为:
lpFileName:将要打开的串口逻辑名,如“COM1”;
dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;
dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;
lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;
dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;
dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;
hTemplateFile:对串口而言该参数必须置为NULL;
同步I/O方式打开串口的示例代码:

HANDLE hCom; //全局变量,串口句柄
hCom=CreateFile("COM1",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}
return TRUE;
(2)、配置串口
在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。
一般用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置。要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口。
typedef struct _DCB{
………
//波特率,指定通信设备的传输速率。这个成员可以是实际波特率值或者下面的常量值之一:
DWORD BaudRate;
CBR_110,CBR_300,CBR_600,CBR_1200,CBR_2400,CBR_4800,CBR_9600,CBR_19200, CBR_38400,
CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000, CBR_14400

DWORD fParity; // 指定奇偶校验使能。若此成员为1,允许奇偶校验检查

BYTE ByteSize; // 通信字节位数,4—8
BYTE Parity; //指定奇偶校验方法。此成员可以有下列值:
EVENPARITY 偶校验 NOPARITY 无校验
MARKPARITY 标记校验 ODDPARITY 奇校验
BYTE StopBits; //指定停止位的位数。此成员可以有下列值:
ONESTOPBIT 1位停止位 TWOSTOPBITS 2位停止位
ONE5STOPBITS 1.5位停止位
………
} DCB;
winbase.h文件中定义了以上用到的常量。如下:
#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define ONESTOPBIT 0
#define ONE5STOPBITS 1
#define TWOSTOPBITS 2
#define CBR_110 110
#define CBR_300 300
#define CBR_600 600
#define CBR_1200 1200
#define CBR_2400 2400
#define CBR_4800 4800
#define CBR_9600 9600
#define CBR_14400 14400
#define CBR_19200 19200
#define CBR_38400 38400
#define CBR_56000 56000
#define CBR_57600 57600
#define CBR_115200 115200
#define CBR_128000 128000
#define CBR_256000 256000

GetCommState函数可以获得COM口的设备控制块,从而获得相关参数: BOOL GetCommState(
HANDLE hFile, //标识通讯端口的句柄
LPDCB lpDCB //指向一个设备控制块(DCB结构)的指针
);
SetCommState函数设置COM口的设备控制块:
BOOL SetCommState(
HANDLE hFile,
LPDCB lpDCB
);

除了在BCD中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。Windows用I/O缓冲区来暂存串口输入和输出的数据。如果通信的速率较高,则应该设置较大的缓冲区。调用SetupComm函数可以设置串行口的输入和输出缓冲区的大小。 BOOL SetupComm(

HANDLE hFile, // 通信设备的句柄
DWORD dwInQueue, // 输入缓冲区的大小(字节数)
DWORD dwOutQueue // 输出缓冲区的大小(字节数)
);

在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。超时的作用是在指定的时间内没有读入或发送指定数量的字符,ReadFile或WriteFile的操作仍然会结束。
要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。
读写串口的超时有两种:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延。总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用COMMTIMEOUTS结构可以规定读写操作的超时。
COMMTIMEOUTS结构的定义为: typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; //读间隔超时
DWORD ReadTotalTimeoutMultiplier; //读时间系数
DWORD ReadTotalTimeoutConstant; //读时间常量
DWORD WriteTotalTimeoutMultiplier; // 写时间系数
DWORD WriteTotalTimeoutConstant; //写时间常量
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+时间常量
例如,要读入10个字符,那么读操作的总超时的计算公式为:
读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant
可以看出:间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。

如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时。如果ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都为0,则不使用读总超时。如果读间隔超时被设置成MAXDWORD并且读时间系数和读时间常量都为0,那么在读一次输入缓冲区的内容后读操作就立即返回,而不管是否读入了要求的字符。
在用重叠方式读写串口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。
配置串口的示例代码: SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

在读写串口之前,还要用PurgeComm()函数清空缓冲区,该函数原型: BOOL PurgeComm(

HANDLE hFile, //串口句柄
DWORD dwFlags // 需要完成的操作
);

参数dwFlags指定要完成的操作,可以是下列值的组合: PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。
PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。
PURGE_TXCLEAR 清除输出缓冲区
PURGE_RXCLEAR 清除输入缓冲区

(3)、读写串口
我们使用ReadFile和WriteFile读写串口,下面是两个函数的声明:

BOOL ReadFile(

HANDLE hFile, //串口的句柄

// 读入的数据存储的地址,
// 即读入的数据将存储在以该指针的值为首地址的一片内存区
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead, // 要读入的数据的字节数

// 指向一个DWORD数值,该数值返回读操作实际读入的字节数
LPDWORD lpNumberOfBytesRead,

// 重叠操作时,该参数指向一个OVERLAPPED结构,同步操作时,该参数为NULL。
LPOVERLAPPED lpOverlapped
);
BOOL WriteFile(

HANDLE hFile, //串口的句柄

// 写入的数据存储的地址,
// 即以该指针的值为首地址的nNumberOfBytesToWrite
// 个字节的数据将要写入串口的发送数据缓冲区。
LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite, //要写入的数据的字节数

// 指向指向一个DWORD数值,该数值返回实际写入的字节数
LPDWORD lpNumberOfBytesWritten,

// 重叠操作时,该参数指向一个OVERLAPPED结构,
// 同步操作时,该参数为NULL。
LPOVERLAPPED lpOverlapped
);

在用ReadFile和WriteFile读写串口时,既可以同步执行,也可以重叠执行。在同步执行时,函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,这两个函数也会立即返回,费时的I/O操作在后台进行。
ReadFile和WriteFile函数是同步还是异步由CreateFile函数决定,如果在调用CreateFile创建句柄时指定了FILE_FLAG_OVERLAPPED标志,那么调用ReadFile和WriteFile对该句柄进行的操作就应该是重叠的;如果未指定重叠标志,则读写操作应该是同步的。ReadFile和WriteFile函数的同步或者异步应该和CreateFile函数相一致。
ReadFile函数只要在串口输入缓冲区中读入指定数量的字符,就算完成操作。而WriteFile函数不但要把指定数量的字符拷入到输出缓冲区,而且要等这些字符从串行口送出去后才算完成操作。
如果操作成功,这两个函数都返回TRUE。需要注意的是,当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。这说明重叠操作还未完成。
您可以观察返回的字符串,其中有和仪表显示值相同的部分,您可以进行相应的字符串操作取出仪表的显示值。
打开ClassWizard,为静态文本框IDC_DISP添加CString类型变量m_disp,同时添加WM_CLOSE的相应函数: void CRS485CommDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom); //程序退出时关闭串口
CDialog::OnClose();
}

程序的相应部分已经在代码内部作了详细介绍。连接好硬件部分,编译运行程序,细心体会串口同步操作部分。
例程2

打开VC++6.0,新建基于对话框的工程RS485Comm,在主对话框窗口IDD_RS485COMM_DIALOG上添加两个按钮,ID分别为IDC_SEND和IDC_RECEIVE,标题分别为“发送”和“接收”;添加一个静态文本框IDC_DISP,用于显示串口接收到的内容。在RS485CommDlg.cpp文件中添加全局变量:

HANDLE hCom; //全局变量,
串口句柄在RS485CommDlg.cpp文件中的OnInitDialog()函数添加如下代码:

hCom=CreateFile("COM1",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}

SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是100

COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。

//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

分别双击IDC_SEND按钮和IDC_RECEIVE按钮,添加两个按钮的响应函数: void CRS485CommDlg::OnSend()
{
// TODO: Add your control notification handler code here
OVERLAPPED m_osWrite;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7);
lpOutBuffer[0]=''\x11'';
lpOutBuffer[1]=''0'';
lpOutBuffer[2]=''0'';
lpOutBuffer[3]=''1'';
lpOutBuffer[4]=''0'';
lpOutBuffer[5]=''1'';
lpOutBuffer[6]=''\x03'';

DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,
dwBytesWrite,& dwBytesWrite,&m_osWrite);

if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
}
}

}

void CRS485CommDlg::OnReceive()
{
// TODO: Add your control notification handler code here
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

COMSTAT ComStat;
DWORD dwErrorFlags;

char str[100];
memset(str,''\0'',100);
DWORD dwBytesRead=100;//读取的字节数
BOOL bReadStat;

ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
bReadStat=ReadFile(hCom,str,
dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(m_osRead.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
}
}

PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}

打开ClassWizard,为静态文本框IDC_DISP添加CString类型变量m_disp,同时添加WM_CLOSE的相应函数: void CRS485CommDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom); //程序退出时关闭串口
CDialog::OnClose();
}

这是我看过的一个资料。打开、设置和读写串口的方法都说的很详细了。由于网络知道回答问题是有长度限制的。有些例子被我删了。如果需要就加我QQ。给你发信息了。

㈧ 用visual C++怎样编一个最简单的串口程序

用VC++6.0实现PC机与单片机之间

串行通信的方法

湖南大学(长沙410082) 于小亿 王 辉 张志学

摘 要 详细介绍了在Windows环境下应用VC++实现PC机与单片机的几种串行通信方法,给出了用Visual C++6.0编写的PC机程序和用C51编写的单片机通信程序。经实际应用系统运行稳定可靠。

关键词 Visual C++ 类 串行通信

--------------------------------------------------------------------------------

工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。

VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT 类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。

1 Windows API通信函数方法

与通信有关的Windows API函数共有26个,但主要有关的有:

CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。

ReadFile() 读串口。

WriteFile() 写串口。

CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。

2 利用端口函数直接操作

这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:

int _inp(unsigned shot port)

该函数从端口读取一个字节,端口号为0~65535。

写端口的函数原型为:

int _outp(unsigned shot port, int databyte)

该函数向指定端口写入一个字节。

不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述。



3 MSComm控件

MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。

3.1 MSComm控件的属性

CommPort:设置串口号,类型 short :1-comm1 2-comm2.

Settings:设置串口通信参数,类型 CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。

PortOpen:设置或返回串口状态,类型 BOOL:TURE打开,FALSE关闭。

InputMode:设置从接收缓冲区读取数据的格式,类型 long: 0-Text 1-Bin。

Input:从接收缓冲区读取数据,类型 VARIANT。

InBufferCount:接收缓冲区中的字节数,类型:short。

InBufferSize:接收缓冲区的大小,类型:short。

Output:向发送缓冲区写入数据,类型:VARIANT。

OutBufferCount:发送缓冲区中的字节数,类型:short。

OutBufferSize:发送缓冲区的大小,类型:short。

InputLen:设置或返回Input读出的字节数,类型:short。

CommEvent:串口事件,类型:short。



3.2 程序示例

串口初始化

if (!m_comm.GetPortOpen())

m_comm.SetPortOpen(TURE); /*打开串口*/

m_comm.SetSettings( "4800,n,8,1 "); /*串口参数设置*/

m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/

m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/

接收数据

m_comm.SetInputLen(1); /*每次读取一个字符

VARINAT V1=m_comm.GetInput();

/*读入字符*/

m_V1=V1.bstrval;

发送字符 m_comm.SetOutput(Colevariant ( "Hello "); /*发送 “Hello” */

3.3 注意

SetOutput方法可以传输文本数据或二进制数据。用SetOutput方法传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。此处望引起读者注意,笔者曾经在此犯错。

4 VC++类CSerial

4.1 串行通信类CSerial简介

Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。以下为该类定义的说明部分。

class CSerial

{

public:

CSerial();

~CSerial();

BOOL Open( int nPort = 2, int nBaud = 9600 );

BOOL Close( void );

int ReadData( void *, int );

int SendData( const char *, int );

int ReadDataWaiting( void );

BOOL IsOpened( void ){ return( m_bOpened ); }

protected:

BOOL WriteCommByte( unsigned char );

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_OverlappedWrite;

BOOL m_bOpened;

}



4.2 串行通信类Cserial 成员函数简介

1. CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。

2. CSerial:: Open这个成员函数打开通信端口。带两个参数,第一个是端口号,有效值是1到4,第二个参数是波特率,返回一个布尔量。

3. CSerial:: Close函数关闭通信端口。类析构函数调用这个函数,所以可不用显式调用这个函数。

4. CSerial:: SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。

5. CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。

6. CSerial:: ReadData函数从端口接收缓冲区读入数据。第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。

阅读全文

与visualc串口通信编程相关的资料

热点内容
linux安装xdm 浏览:736
java计算12 浏览:249
大金空调摆动式压缩机 浏览:453
新的云服务器如何设置首页 浏览:687
javastring字符位置 浏览:196
银河麒麟字体库存在哪个文件夹 浏览:956
魔兽加丁服务器的航空叫什么 浏览:152
花冠改装案例哪个app多 浏览:515
成绩单app哪个好用 浏览:140
北美程序员vs国内程序员 浏览:181
php解析xml文档 浏览:121
石墨文档APP怎么横屏 浏览:185
墙主钢筋加密和非加密怎么看 浏览:144
金山区文件夹封套定制 浏览:708
soho程序员 浏览:672
java字节截取 浏览:526
php提交作业 浏览:816
房产还没解压可以办理赠予吗 浏览:224
java毫秒转分钟 浏览:753
模式识别中文pdf 浏览:774