pcommlite串口通讯库使用

本文介绍了如何使用pcommlite库解决MFC环境下串口编程的问题,包括查找系统串口、配置串口参数、发送和接收数据,以及设置定时器进行数据接收的方法。
MFC下串口编程使用最多的两种方法是读取注册表和使用mscomm组件,都有着或多或少的缺陷,调用系统SDK比较麻烦,MSCOMm组件最多支持16个串口,串口号大于16的时候无法打开,遇到这种情况,可以使用一个名为pcommlite的串口通讯库,下载安装之后,解压出来的文件包括

根据编译的平台选择相应的lib文件加入工程,并加入pcomm.h文件

 

1.      寻找系统串口,sio_open()打开串口 sio_close()关闭串口

2.      BYTE i = 0;

3.      CString str;

4.      // TODO: 在此添加控件通知处理程序代码

5.      ((CComboBox *)this->GetDlgItem(IDC_COMBO_Serial_Num_Select))->ResetContent();

6.      for (= 0;< 255;i++)

7.      {//此程序支持255个串口

8.          if(SIO_OK == sio_open(i))

9.          {

10.            sio_close(i);

11.            str.AppendFormat("COM%d",i);

12.            ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->AddString(str);

13.            str.Empty();

14.        }

15.    }

16.    i = ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->GetCount();

17.    if(==0)

18.    {

19.        GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(FALSE);

20.    }

21.    else

22.    {

23.        GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(TRUE);

24.    }

 

2.打开串口,各种库宏定义

    switch(comBaud)

        {

        case 0:

           m_comBaud = B1200;

            break;

        case 1:

           m_comBaud = B2400;

            break;

        case 2:

           m_comBaud = B4800;

            break;

        case 3:

           m_comBaud = B9600;

            break;

        case 4:

           m_comBaud = B19200;

            break;

        case 5:

           m_comBaud = B38400;

            break;

        case 6:

           m_comBaud = B57600;

            break;

        case 7:

            m_comBaud= B115200;

            break;

        case 8:

           m_comBaud = B230400;

            break;

        }

        switch(comStopBit)

        {

        case 0:

           m_comStopBit = STOP_1;

            break;

        case 1:

           m_comStopBit = STOP_2;

            break;

        }

        switch (comDataLength)

        {

        case 0:

           m_comDataLength = BIT_5;

            break;

        case 1:

           m_comDataLength = BIT_6;

            break;

        case 2:

           m_comDataLength = BIT_7;

            break;

        case 3:

           m_comDataLength = BIT_8;

            break;

        }

        switch(comCheckSum)

        {

        case 0:

           m_comChecksum = P_NONE;

            break;

        case 1:

           m_comChecksum = P_ODD;

            break;

        case 2:

           m_comChecksum = P_EVEN;

            break;

        }

        config = m_comDataLength|m_comStopBit|m_comChecksum;

        //开始串口配置

        if( sio_open(m_comPort) != SIO_OK)

        {

           MessageBox("串口打开失败","提示",MB_OK);

            this->serialsIsOpen = false;

           m_comPort = 0;

            return;

        }

       sio_flowctrl(m_comPort,0x00);//关闭硬件流控制

        sio_lctrl(m_comPort,0x00);//关闭RTS DTR

        sio_ioctl(m_comPort,m_comBaud,config);

        sio_flush(m_comPort,2);

        this->GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->SetWindowText("关闭串口");

        GetDlgItem(IDC_COMBO_Serial_Num_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Baud_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Data_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Parity_Select)->EnableWindow(FALSE);

        GetDlgItem(IDC_COMBO_Serial_Stop_Select)->EnableWindow(FALSE);

        this->serialsIsOpen = true;

    }

 

3.串口发送数据 sio_lstatus() sio_write()

//检查串口是否打开,打开就发送

    if(serialsIsOpen == true)

    {

        //变量打开了,要去测试串口状态

        if(sio_lstatus(m_comPort)>= 0)

        {

            CStringstr1;

           sendString.Empty();

            //没有对\r\n特殊处理

            ((CEdit*)GetDlgItem(IDC_EDIT3))->GetWindowText(str1);

           sendString.AppendFormat("%s",str1);

           sio_write(m_comPort,sendString.GetBuffer(),sendString.GetLength());

        }

        else

        {

            //说明串口已经丢失

           MessageBox("串口丢失,请关闭后重新打开","错误",MB_OK);

        }

    }

    else

    {

        //说明串口已经丢失

        MessageBox("请先打开串口","错误",MB_OK);

    }

4.设定定时器,用于串口接收数据

5.在定时器中接收数据 sio_read()

void CLPC1768_PAD_OTG_DebugDlg::SerialsProcessBuffer( void )

{

    serialReadTemp.Empty();

    if(m_comPort > 0 && this->serialsIsOpen == true)

    {

        char readBuffer[1024] = {0};

        //      sio_flush(m_comPort,1);

        int length = sio_read(m_comPort,readBuffer,1024);

        if(length > 0)

        {

            for(int i = 0; i < length; i++)

            {

               serialReadTemp.AppendChar(readBuffer[i]);

            }

        }

    }

}

 

该库还有很多借口用于控制DTRRTS,使用方便,详情查看帮助文档

Moxa是一家做了几十年工业串口卡、串口服务器之类设备的公司,PComm Lite是一套易用性、可靠性久经考验串口编程开发包。相比用API或mscomm控件开发简单太多了。 版本:目前最新版是Version 1.6. Released May 14, 2012 支持XP/win7, 32/64bit的都有,开发环境支持VC/VB/Delphi。注意可以会搜到另外一个Version 2.6. Released Jul 8, 2008,那是在WIN9x/NT4用的,不要看版本号高下错了。 使用方法:运行安装后有类、例程、帮助和几个小工具。关键的有四个文件:pcomm.h/pcomm.lib两个文件复制到项目目录并引用,pcomm.dll丢到windows\system32下或跟应用程序放在一起,pcomm.chm帮助备查。 函数介绍:整个包含50多个函数,最常用的也就10来个: 打开、关闭、设波特率的:sio_open ()、sio_close()、sio_baut() 发送数据的:sio_putch(),sio_write() 接收数据的:sio_getch(),sio_read() 查询输入输出缓冲区状态的:sio_iqueue(), sio_oqueue() 有时可能要设读写超时:sio_SetReadTimeouts(), sio_SetWriteTimeouts() 这些函数见名知义,用法查一下PComm.chm就行了。 编程方法: 接收数据一般免不了要开线程的,在接收线程里sio_iqueue()看一下有没有数据,有就处理,没就Sleep()一会。接收数据时它至少会帮你缓冲几十k,一般也不会丢数据。也可以用sio_term_irq()指定接收一定长数据数据就调用一个CALLBACK函数。 这些基本就齐活了。需要控制DTS/RTS、自动流控制都有,甚至还有Xmoderm/Ymoderm/Zmoderm发送文件。如果要Modbus之类的协议就要自己写了。 与其它串口开发方式比较:简单地说API是基础零件,自己做起来麻烦。MSComm控件、CSerialPort类是实验室产品,Pcomm lite是工业成熟产品。
Moxa是一家做了几十年工业串口卡、串口服务器之类设备的公司,PComm Lite是一套易用性、可靠性久经考验串口编程开发包。相比用API或mscomm控件开发简单太多了。 版本:目前最新版是Version 1.6 Released May 14, 2012 支持XP/win7, 32/64bit的都有,开发环境支持VC/VB/Delphi。注意可以会搜到另外一个Version 2.6. Released Jul 8, 2008,那是在WIN9x/NT4用的,不要看版本号高下错了。 使用方法:运行安装后有类、例程、帮助和几个小工具。关键的有四个文件:pcomm.h/pcomm.lib两个文件复制到项目目录并引用,pcomm.dll丢到windows\system32下或跟应用程序放在一起,pcomm.chm帮助备查。 函数介绍:整个包含50多个函数,最常用的也就10来个: 打开、关闭、设波特率的:sio_open ()、sio_close()、sio_baut() 发送数据的:sio_putch(),sio_write() 接收数据的:sio_getch(),sio_read() 查询输入输出缓冲区状态的:sio_iqueue(), sio_oqueue() 有时可能要设读写超时:sio_SetReadTimeouts(), sio_SetWriteTimeouts() 这些函数见名知义,用法查一下PComm.chm就行了。 编程方法: 接收数据一般免不了要开线程的,在接收线程里sio_iqueue()看一下有没有数据,有就处理,没就Sleep()一会。接收数据时它至少会帮你缓冲几十k,一般也不会丢数据。也可以用sio_term_irq()指定接收一定长数据数据就调用一个CALLBACK函数。 这些基本就齐活了。需要控制DTS/RTS、自动流控制都有,甚至还有Xmoderm/Ymoderm/Zmoderm发送文件。如果要Modbus之类的协议就要自己写了。 与其它串口开发方式比较:简单地说API是基础零件,自己做起来麻烦。MSComm控件、CSerialPort类是实验室产品,Pcomm lite是工业成熟产品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值