#include "stdlib.h"
#include "windows.h"
#include <TCHAR.H>
#include<iostream>
#include<TCHAR.H>
#include<string.h>
using namespace std;
HANDLE hCom; //全局变量,串口句柄
int serial_open(LPCWSTR COMx, int BaudRate) {
hCom = CreateFile(COMx, //COM1口
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //重叠方式FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED (同步方式设置为0)
NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
printf("打开COM失败!\n");
return FALSE;
}
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 = BaudRate; //设置波特率为BaudRate
dcb.ByteSize = 8; //每个字节有8位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = ONESTOPBIT; //一个停止位
SetCommState(hCom, &dcb); //设置参数到hCom
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓存区 //PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。
//PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。
//PURGE_TXCLEAR 清除输出缓冲区
//PURGE_RXCLEAR 清除输入缓冲区
return TRUE;
}
int serial_read(char str[], int size) //同步读串口
{
DWORD rCount; //读取的字节数
BOOL bReadStat;
bReadStat = ReadFile(hCom, str, size, &rCount, NULL);
if (!bReadStat)
{
printf("读串口失败!\n");
return FALSE;
}
return rCount;
}
void Serial_close(void) //关闭串口
{
CloseHandle(hCom);
}
int main()
{
int len;
serial_open(_T("COM1"), 9600);
while (1)
{
char for_read[100];
len = serial_read(for_read, 100);
if (len)
{
printf("len=%d\n", len);
for (size_t i = 0; i<len; i++)
printf("read %x ", for_read[i]);
}
}
Serial_close();
system("pause");
return 0;
}
串口通信
最新推荐文章于 2023-11-30 07:30:00 发布