您的位置:首页 > 理论基础

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

2014-04-06 11:51 197 查看
#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
); //关闭设备句柄
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: