Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51805
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 172
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-04 14:17
文章分类

全部博文(18)

文章存档

2014年(3)

2013年(15)

我的朋友

分类: WINDOWS

2013-02-05 15:38:55

代码:


#include 
#include 
#include  // 声明快照函数的头文件


HANDLE hCom;


void CALLBACK TimeProc(
    HWND hwnd,
    UINT message,
    UINT idTimer,
    DWORD dwTime);






int main(int argc, char* argv[])
{


    LPCTSTR lpComx;
    int i;


    printf("开始通讯\n");


    printf("输入串口名:(1-9)\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1:
        lpComx="COM1";
        break;
    case 2:
        lpComx="COM2";
        break;
    case 3:
        lpComx="COM3";
        break;
    case 4:
        lpComx="COM4";
        break;
    case 5:
        lpComx="COM5";
        break;
    case 6:
        lpComx="COM6";
        break;
    case 7:
        lpComx="COM7";
        break;
    case 8:
        lpComx="COM8";
        break;
    case 9:
        lpComx="COM9";
        break;
    default:
        printf("串口号错误\n");
        return 0;
        break;
    }


    hCom=CreateFile(lpComx,
                    GENERIC_READ|GENERIC_WRITE,
                    0,
                    NULL,
                    OPEN_EXISTING,
                    0,//同步方式
                    NULL);
    if(hCom==(HANDLE)-1)
    {
        printf("打开\"%s\"失败!",lpComx);
        return 0;
    }
    printf("打开\"%s\"成功\n",lpComx);


    /*
    配置串口
    */
    SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024
    COMMTIMEOUTS TimeOuts;
    //设定读超时
    TimeOuts.ReadIntervalTimeout = 1000;
    TimeOuts.ReadTotalTimeoutMultiplier = 0;
    TimeOuts.ReadTotalTimeoutConstant = 0;
    //设定写超时
    TimeOuts.WriteTotalTimeoutMultiplier = 500;
    TimeOuts.WriteTotalTimeoutConstant = 2000;
    SetCommTimeouts(hCom, &TimeOuts); //设置超时






    DCB dcb;
    GetCommState(hCom, &dcb);
    dcb.BaudRate = 1200; //波特率为9600
    dcb.ByteSize = 8; //每个字节有8位
    dcb.Parity = NOPARITY; //无奇偶校验位
    dcb.StopBits = ONESTOPBIT; //一个停止位
    SetCommState(hCom, &dcb);


    //在读写串口之前,还要用PurgeComm()函数清空缓冲区
    PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);




    SetTimer(NULL,1,1000,TimeProc);
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        if(msg.message==WM_TIMER)
        {
            DispatchMessage(&msg);
        }


    }
    return 0;
}


//定时器触发调用函数
void CALLBACK TimeProc(HWND hwnd,
                       UINT message,
                       UINT idTimer,
                       DWORD dwTime)
{
     PurgeComm(hCom, PURGE_TXABORT|
              PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);


    unsigned char  uartOutBuffer[11]={0xe5,0x02,0x03,0xff,0x04,0x05,
                            0x06,0x07,0x08,0x09,0x0a};
    DWORD dwBytesWrite=11;
    COMSTAT ComStat;
    DWORD dwErrorFlags;
    BOOL bWriteStat;
    ClearCommError(hCom,&dwErrorFlags,&ComStat);
    bWriteStat = WriteFile(hCom, uartOutBuffer, dwBytesWrite, &dwBytesWrite, NULL);
    if(!bWriteStat)
    {
        printf("写串口失败!\n");
    }
    else
    {
        printf("写串口成功!\n");
    }


    PurgeComm(hCom, PURGE_TXABORT|
              PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);






    unsigned char  uartInBuffer[8];
    DWORD wCount;//读取的字节数
    BOOL bReadStat;
    bReadStat = ReadFile(hCom,uartInBuffer,8,&wCount,NULL);
    if(!bReadStat)
    {
        printf("读串口失败!\n");
    }
    else
    {
        printf("串口接收:0x%x  0x%x  0x%x  0x%x  0x%x  0x%x  0x%x  0x%x\n",
               uartInBuffer[0],uartInBuffer[1],uartInBuffer[2],uartInBuffer[3],
               uartInBuffer[4],uartInBuffer[5],uartInBuffer[6],uartInBuffer[7]);
    }


}




参考:http://www.cnblogs.com/xi52qian/archive/2011/08/30/2159675.html
         http://www.programfan.com/blog/article.asp?id=29793

这个程序已经与显示板调通


PS:看到句柄神马的真有点云里雾里,还是先用控制台玩玩等春节后显示板程序都完善了。届时搞个完善的上位机程序模拟主控板。


阅读(811) | 评论(0) | 转发(0) |
0

上一篇:Win32串口API

下一篇:素数判断

给主人留下些什么吧!~~