串口同步操作DEMO

来源:互联网 发布:江苏普通发票软件下载 编辑:程序博客网 时间:2024/05/17 04:56
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。

//实现串口的同步读写

//同步读写同一时刻只能读或者写,当等待读取的时候,写操作将死等

#include "stdafx.h"
#include "string.h"
#include "Windows.h"

HANDLE m_DevHandle;
int nRet;

BOOL serial_test1()
{
m_DevHandle = CreateFileA("COM4",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
0);

if (INVALID_HANDLE_VALUE == m_DevHandle)
{
m_DevHandle = NULL;
printf_s("打开串口失败\n");
return FALSE;
}
else
{
printf_s("打开串口成功\n");
}

//超时设置
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 20;//指定了在接收字符间的最大时间,如果超过了这个时间,ReadFile立即返回
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;//平局读取一个字节的时间上限(允许等待的最大值)   
CommTimeOuts.ReadTotalTimeoutConstant = 0;//额外等待的时间长量
//总的等待时间=ReadTotalTimeoutMultiplier*要读的字节总个数+ReadTotalTimeoutConstant
//如果ReadTotalTimeoutMultiplier=0,ReadTotalTimeoutConstant=0,如果么没有收到数据,将一直等待,直到读取到数据位置 然后在 ReadIntervalTimeout后未有新数据来时退出
//ReadIntervalTimeout=0;读取完缓冲区的数据立即退出,不等待下一个字节

CommTimeOuts.WriteTotalTimeoutMultiplier = 10;//表示平均写一个字节的时间上限(允许写一个字节花费的时间) 
CommTimeOuts.WriteTotalTimeoutConstant = 20;//额外等待写数据的超时时间 表示写数据总超时常量
//总的写等待的超时时间 T=WriteTotalTimeoutMultiplier*写入的个数+WriteTotalTimeoutConstant;
SetCommTimeouts(m_DevHandle, &CommTimeOuts);

//属性设置
DCB dcb;
GetCommState(m_DevHandle, &dcb);
dcb.BaudRate = 115200;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8;
SetCommState(m_DevHandle, &dcb);

SetupComm(m_DevHandle, 1024, 1024); //缓冲区的大小为1024


byte sendBuff[10] = { 1, 2, 3, 4, 5, 6, 7 };
DWORD dwBytesWritten;//实际写入发送成功的字节
nRet = WriteFile(m_DevHandle, sendBuff, 10, &dwBytesWritten, NULL);
if (nRet == FALSE)
{
//如果发生错误(句柄错误,串口已关闭,串口不存在)都会返回 FALSE
printf_s("写入错误\n");
return FALSE;
}

byte arrReadBuff[100] = { 0 };
DWORD dwReadLen = 0;//实际读到的字节数
while (true)
{
Sleep(10);
nRet = ReadFile(m_DevHandle, arrReadBuff, 100, &dwReadLen, NULL);
if (nRet == FALSE)
{//如果发生错误(句柄错误,串口已关闭,串口不存在)都会返回 FALSE
printf_s("读取发生错误 退出死循环\n");
CloseHandle(m_DevHandle);
m_DevHandle = NULL;//关闭后清除句柄 防止再次关闭造成错误
return FALSE;
}
if (dwReadLen > 0)
{
for (int i = 0; i < dwReadLen; i++)
{
printf_s("%02X ", arrReadBuff[i]);
}
printf_s("\n");
}
}
}

int _tmain(int argc, _TCHAR* argv[])
{
serial_test1();
CloseHandle(m_DevHandle);//可以关闭空句柄
m_DevHandle = NULL;
system("PAUSE");
return 0;
}