c++ windows串口传输数据

用虚拟串口软件  测试

/////////////////////////////////////////////////////SerialPort.h////////////////////////////////////////////////////////

#include "SerialPort.h"

HANDLE OpenSerialPort(string & strPort, ULONG ulBaudrate)
{
HANDLE hSerial;
hSerial = CreateFile((strPort.c_str()),
GENERIC_READ | GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
NULL,
NULL);
if (hSerial == INVALID_HANDLE_VALUE)//Open serial port failed.
{
return hSerial;
}
//Config serial port
DCB PortDCB;
PortDCB.DCBlength = sizeof(DCB);
// Get the default serial parameter.
GetCommState(hSerial, &PortDCB);
PortDCB.BaudRate = ulBaudrate; // baudrate
PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
if (!SetCommState(hSerial, &PortDCB))
{
//config the serial port failed.
CloseHandle(hSerial);
return (INVALID_HANDLE_VALUE);
}
//Config the serial port timeout property.
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(hSerial, &CommTimeouts);//Get the serial port default timeout.
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier = 10;
CommTimeouts.ReadTotalTimeoutConstant = 10;
CommTimeouts.WriteTotalTimeoutMultiplier = 50;
CommTimeouts.WriteTotalTimeoutConstant = 100;
if (!SetCommTimeouts(hSerial, &CommTimeouts))
{
//config the serial port timeout failed;
CloseHandle(hSerial);
return (INVALID_HANDLE_VALUE);
}
return (hSerial);
};
void CloseSerialPort(HANDLE hSerial)
{
CloseHandle(hSerial);
};
bool WriteSerial(char* btData, ULONG ulSize, HANDLE hSerial)
{
DWORD dwNumBytes, dwRet;
dwRet = WriteFile(hSerial, //Handle
btData, //Data buffer
ulSize, //Buffer size
&dwNumBytes, //written bytes
NULL); //don‘t support
return (dwRet != 0);
};
bool ReadSerial(BYTE *btData, ULONG *ulSize, HANDLE hSerial)
{
//SetCommMask (hSerial, EV_RXCHAR);
ULONG ulRdSize = 0;
BYTE Byte;
DWORD dwBytes;
bool blRd = false;
DWORD dwMask = EV_RXCHAR;
//WaitCommEvent(hSerial,&dwMask,NULL);
SetCommMask(hSerial, EV_RXCHAR);
while (ReadFile(hSerial, &Byte, 1, &dwBytes, 0) != 0) {
if (dwBytes>0) {
btData[ulRdSize++] = Byte;
if (ulRdSize == *ulSize) {
blRd = true;
break;
}
}
else {
blRd = true;
break;
}
}

*ulSize = ulRdSize;
return (blRd);
};

//===========================SerialPort.H的开始=========================

#pragma once
#include <windows.h>
#include <string>

using namespace std;
HANDLE OpenSerialPort(string & strPort, ULONG ulBaudrate);
void CloseSerialPort(HANDLE hSerial);
bool WriteSerial(char* btData, ULONG ulSize, HANDLE hSerial);
bool ReadSerial(BYTE *btData, ULONG *ulSize, HANDLE hSerial);
//===========================SerialPort.H的结束=========================

////////////////////////////////////////////////////////////////main.cpp////////////////////////////////////////////////////////////////////

//使用代码示例:
#include "SerialPort.h"
#include <iostream>
using namespace std;

HANDLE hSerialPort;

int main()
{
string portname = "COM4:";
string buff = "HELLO!";
char c[20];
strcpy_s(c, buff.c_str());

hSerialPort = OpenSerialPort( portname, 9600);//Open serial port com1

if (hSerialPort != INVALID_HANDLE_VALUE)
{
if (!WriteSerial(c, 7, hSerialPort))//Send data hello to com1
//MessageBox(0, "ERROR", "ERROR", MB_ICONWARNING);//show error message
printf("ERROR!!");
//CloseSerialPort(hSerialPort);
}
system("pause");
}

时间: 2024-08-25 18:01:16

c++ windows串口传输数据的相关文章

storysnail的Windows串口编程笔记

storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Public License,v3 发布 GPLv3 许可证的副本可以在这里获得:http://www.gnu.org/licenses/gpl.html 本文档根据GNU Free Documentation License 1.3发布 GFDL1.3许可证的副本可以在这里获得:http:/

Linux与Windows串口通信

串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和特性,及计算机技术的广泛应用深入到生活和生产的各个领域,世界上数以亿计的通讯设备都以串口通讯的方式.在进行着数据的传输.在一个应用系统中,同时使用Windows和Linux操作系统,合理地分配资源,各取所长,是实现系统高性能的有效途径.为了使两个不同操作系统能协同工作,实现资源和数据共享,需要在两者

android设备使用usb串口传输数据

首先介绍两个开源项目一个是Google的开源项目:https://code.google.com/archive/p/android-serialport-api/ 另一个是我们这次介绍的开源项目:https://github.com/mik3y/usb-serial-for-android 第一步:获取所有的已插入的串口驱动 1 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 2 List<Usb

Windows串口编程

串口基础知识 http://www.cnblogs.com/menlsh/archive/2013/01/28/2880580.html DTU知识 http://blog.csdn.net/xutonghuang1986/article/details/16845491 http://blog.csdn.net/bichenggui/article/details/7889638

串口传输数据发生错误的原因

问题1. 昨天用之前的方法处理好串口发送数据的程序,结果发现发送数据总是会发送错误一些数据,百思不得其解,结果发现是 因为没有给串口转接板提供电源以及没有和单片机共地. 问题2. char buffer[]; void TIM2_IRQHandler(void){ /* USER CODE BEGIN TIM2_IRQn 0 */ time_count++;// printf("%d\r\n",time_count); sprintf(buffer,"aaaaaaaaaaaa

python-Arduino串口传输数据到电脑并保存至excel表格

起因:学校运河杯报了个项目,制作一个天气预测的装置.我用arduino跑了BME280模块,用蓝牙模块实现两块arduino主从机透传.但是为了分析,还需要提取出数据.因此我用python写了个上位机程序,用pyserial模块实现arduiho和电脑的串口通讯,再用xlwt模块写入excel表格,用time模块获取时间作为excel的文件名. 1 import xlwt 2 import time 3 import serial 4 #设置表格样式 5 def set_style(name,h

Linux下串口编程【转】

本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但是这个完整的程序里面本来有语法错误的,现在让我改过来了************/ --------------------------------------------------------- Author             :tiger-johnWebSite            :b

11、串口编程

1.串口的介绍     串口的介绍, 串口发送的顺序: 1.空闲位:这里是连续的 1 2.起始位:低电平 3.数据位:对于传输的数据位这里是自己去设定传输位数,可以5.6.7.8位,但是我们一般设置为  8位 串口的数据是从低位开始发送 4.奇偶校验位:保证传输数据位中的 1 的个数是奇数还是偶数.奇校验:保证数据位中的'1'是奇数个,当数据位中的'1'是奇数个的时候,那么校验位填零:当数据位中的'1'是偶数个的时候,则校验位填为'1'. 5.停止位:低电平.持续时间为一个或者 1.5 个字符的

Linux 程序设计学习笔记----终端及串口编程及实例应用

转载请注明出处,http://blog.csdn.net/suool/article/details/38385355. 部分内容类源于网络. 终端属性详解及设置 属性 为了控制终端正常工作,终端的属性包括输入属性.输出属性.控制属性.本地属性.线路规程属性以及控制字符. 其在系统源代码的termios.h中定义(具体的说明文档http://pubs.opengroup.org/onlinepubs/7908799/xsh/termios.h.html),其结构体成员主要是 Thetermios