用C语言编程操作计算机串口的问题

   #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <windows.h>
    #include <winnt.h>

    #define BAUD_RATE  9600 
    #define COM1_BASE  ???                        /* com1基地址 */
    #define p  printf
    
    int main()
    {
    /*  打开串口  */
    Handle hCom;
   //    int pos;
    unsigned char  buff[128];                     //要传输串口数据到缓冲区

    /*  把串口作为文件打开  */
    hCom=CreateFile("COM1",                       //打开串口1
                GENERIC_READ|GENERIC_WRITE,       //允许读写
                0,                                //通讯设备必须以独占方式打开
                NULL,                             //安全属性
                OPEN_EXISTING,                    //通讯设备已存在
                FILE_FLAG_OVERLAPPED,             //异步I/O
                0,                                //通讯设备不能用模板打开
                NULL);   
    if(hCom==(HANDLE)-1)                          //打开串口失败返回
    {
    p("打开串口失败");
    return 0;
        }

    /*  串口超时结构体设置  */
     typedef COMMTIMEOUTS TimeOuts
    {
    TimeOuts.ReadIntervalTimeout=1000;            //接收时两字符之间的最大时延
    TimeOuts.ReadTotalTimeoutMultiplier=500;      //指定以毫秒为单位的累积值,用于计算读操作时的超时总数
    TimeOuts.ReadTotalTimeoutConstant=5000;       //指定以毫秒为单位的常数,用于计算读操作时的超时总数
    TimeOuts.WriteTotalTimeoutMultiplier=500;     //计算写操作时的超时总数
    TimeOuts.WriteTotalTimeoutConstant=2000       //计算写操作时的超时总数
     };
    
    if(!SetCommTimeouts(hCom,&TimeOuts))          //与串口绑定失败返回
    {
        p("与串口绑定失败")
        return 0;
    }
    /* 设置串口各项参数  */
    DCB dcb;
    {
        if(!GetCommState(hCom,&dcb))
            p("获取串口属性失败");
            return 0;
    }
    dcb.BaudRate=BAUD_RATE;     //波特率为9600
    dcb.ByteSize=8;             //设置数据位 
    dcb.Parity=EVENPARITY;      //偶校验
    dcb.StopBits=2;             //两个停止位
    dcb.fBinary=TRUE;
    dcb.fParity=TRUE;

    if(!SetCommState(hCom,&dcb))                  //DCB绑定失败返回
    {
        p("串口设置出错!");
        return 0;
    }
    
    if(!SetupComm(hCom,1024,1024))                //设置串口的输入/输出缓冲区大小
    {
    p("设置串口读写缓冲区失败");
    return 0;
    }
    PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);  //终止所有的后台读写操作并清空缓冲区
   
   /*  发送数据操作  */
    if(WriteFile(hCom,         //文件句柄
        outputData,            //数据缓冲区指针
        sizeBuffer,            //字节数
        &length,               //接收成功发送数据长度的指针
        NULL)==0)              //重叠I/O结构体        
    {
    p("写入串口数据失败");
    return FALSE;
    }

    /*  接收数据  */
        if(ReadFile(hCom,      //文件句柄
        inputData,             //数据缓冲区指针
        sizeBuffer,            //字节数
        &length,               //指向已经读入的字节数
        NULL)==0)              //重叠I/O结构体      
             
    {
    p("读取串口数据失败");
    return FALSE;
    }

   /*  关闭串口  */
   bool CloseHandle
        (
        hCom
        ); //关闭设备句柄

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值