串口通信

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值