Linux串口测试程序; OpenWRT串口测试程序;

来源:互联网 发布:ucloud云计算 编辑:程序博客网 时间:2024/05/17 05:55

硬件平台: MT7620

程序包含:main.cpp; uart.cpp; uart.h


uart.h

#ifndef UART_H_#define UART_H_#include <vector>#include <string>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <errno.h>typedef std::string String;enum FlowControl{<span style="white-space:pre"></span>FLOW_CONTROL_HARD, FLOW_CONTROL_SOFT, FLOW_CONTROL_NONE,};struct tagUARTParam{<span style="white-space:pre"></span>String dev;<span style="white-space:pre"></span>int baudRate;<span style="white-space:pre"></span>int dataBits;<span style="white-space:pre"></span>char parity;<span style="white-space:pre"></span>int stopBits;<span style="white-space:pre"></span>FlowControl flowControl;};class CUART{public:<span style="white-space:pre"></span>CUART();<span style="white-space:pre"></span>virtual ~CUART();<span style="white-space:pre"></span>bool open(tagUARTParam& param);<span style="white-space:pre"></span>int send(char* buf, int len, int timeout);<span style="white-space:pre"></span>int recv(char* buf, int len, int timeout);<span style="white-space:pre"></span>void close();private:<span style="white-space:pre"></span>bool setBaudRate(int baudRate);<span style="white-space:pre"></span>bool setParity(int parity);<span style="white-space:pre"></span>bool setDataBits(int dataBits);<span style="white-space:pre"></span>bool setStopBits(int stopBits);<span style="white-space:pre"></span>bool setFlowControl(FlowControl flowControl);private:<span style="white-space:pre"></span>/** Character used to signal that I/O can start while using<span style="white-space:pre"></span> software flow control with the serial port.<span style="white-space:pre"></span> */<span style="white-space:pre"></span>static const char CTRL_Q = 0x11;<span style="white-space:pre"></span>/** Character used to signal that I/O should stop while using<span style="white-space:pre"></span> software flow control with the serial port.<span style="white-space:pre"></span> */<span style="white-space:pre"></span>static const char CTRL_S = 0x13;<span style="white-space:pre"></span>int serialfd_;};#endif /* SERIALPORT_H_ */

main.cpp


#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <signal.h>#include "memmap.h"#include "hi.h"#include "strfunc.h"#include "uart.h"static tagUARTParam UartParam ={ "/dev/ttyAMA1", 9600, 8, 'N', 1, FLOW_CONTROL_NONE };CUART mUartItem;bool mvUartState;pthread_t m_thread2Handle;char rcv[512];void *ConnectStart(void *param){//pthread_mutex_lock(&DialMutex);//GprsPowerEn(GPIO_CTR_OFF);//sleep(10);int ret =0;while(1){ret = 0;memset(rcv,0,512);ret = mUartItem.recv(rcv,512,500);if(ret > 0){printf("Data >> %s",rcv);}printf("[david]printf ConnectStart!!!\n");sleep(1);}return NULL;}int main(int argc, char * argv[]){mvUartState =false;    //return tmain(argc, argv);mvUartState = mUartItem.open(UartParam);if(mvUartState){printf("[david]uart open is ok\n");pthread_create(&m_thread2Handle,0,ConnectStart,NULL);}while(1){sleep(1);}return 0;}

uart.cpp


#include <termios.h>#include <fcntl.h>#include <sys/time.h>#include "uart.h"CUART::CUART(){serialfd_ = -1;}CUART::~CUART(){close();}bool CUART::open(tagUARTParam& param){serialfd_ = ::open(param.dev.c_str(), O_RDWR|O_NOCTTY);struct termios opt;if (-1 == tcgetattr(serialfd_, &opt)){return false;}cfmakeraw(&opt);if (-1 == tcsetattr(serialfd_, TCSANOW, &opt)){return false;}if (!setBaudRate(param.baudRate)){close();return false;}if (!setParity(param.parity)){close();return false;}if (!setDataBits(param.dataBits)){close();return false;}if (!setStopBits(param.stopBits)){close();return false;}if (!setFlowControl(param.flowControl)){close();return false;}return true;}void CUART::close(){::close(serialfd_);serialfd_ = -1;}speed_t getBaudRate(int speed){static struct{int speed;speed_t val;} Map[] ={{ 115200, B115200 },{ 57600, B57600 },{ 38400, B38400 },{ 19200, B19200 },{ 9600, B9600 },{ 4800, B4800 },{ 2400, B2400 },{ 1200, B1200 },{ 300, B300 } };unsigned int i;for (i = 0; i < sizeof(Map) / sizeof(Map[0]); i++){if ((speed == Map[i].speed)){return Map[i].val;}}return B9600;}bool CUART::setBaudRate(int baudRate){struct termios opt;if (serialfd_ == -1){return false;}if (-1 == tcgetattr(serialfd_, &opt)){return false;}speed_t s = getBaudRate(baudRate);tcflush(serialfd_, TCIOFLUSH);cfsetispeed(&opt, s);cfsetospeed(&opt, s);if (-1 == tcsetattr(serialfd_, TCSANOW, &opt)){return false;}return true;}bool CUART::setParity(int parity){if (-1 == serialfd_){return false;}struct termios options;if (tcgetattr(serialfd_, &options) != 0){return false;}switch (parity){case 'n':case 'N':options.c_cflag &= ~PARENB;options.c_iflag &= ~INPCK;break;case 'o':case 'O':options.c_cflag |= (PARODD | PARENB);options.c_iflag |= INPCK;break;case 'e':case 'E':options.c_cflag |= PARENB;options.c_cflag &= ~PARODD;options.c_iflag |= INPCK;break;case 'S':case 's':options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;break;default:return false;break;}if (-1 == tcsetattr(serialfd_, TCSANOW, &options)){return false;}return true;}bool CUART::setDataBits(int dataBits){if (-1 == serialfd_){return false;}struct termios options;if (tcgetattr(serialfd_, &options) != 0){return -1;}options.c_cflag &= ~CSIZE;switch (dataBits){case 7:options.c_cflag |= CS7;break;case 8:options.c_cflag |= CS8;break;default:return false;break;}if (-1 == tcsetattr(serialfd_, TCSANOW, &options)){return false;}return true;}bool CUART::setStopBits(int stopBits){if (-1 == serialfd_){return false;}struct termios options;if (tcgetattr(serialfd_, &options) != 0){return false;}switch (stopBits){case 1:options.c_cflag &= ~CSTOPB;break;case 2:options.c_cflag |= CSTOPB;break;default:return false;break;}if (-1 == tcsetattr(serialfd_, TCSANOW, &options)){return false;}return true;}bool CUART::setFlowControl(FlowControl flowControl){if (-1 == tcflush(serialfd_, TCIOFLUSH)){return false;}struct termios tset;int retval = tcgetattr(serialfd_, &tset);if (-1 == retval){return false;}if (FLOW_CONTROL_HARD == flowControl){tset.c_iflag &= ~(IXON | IXOFF);tset.c_cflag |= CRTSCTS;tset.c_cc[VSTART] = _POSIX_VDISABLE;tset.c_cc[VSTOP] = _POSIX_VDISABLE;}else if (FLOW_CONTROL_SOFT == flowControl){tset.c_iflag |= IXON | IXOFF;tset.c_cflag &= ~CRTSCTS;tset.c_cc[VSTART] = CTRL_Q;tset.c_cc[VSTOP] = CTRL_S;}else{tset.c_iflag &= ~(IXON | IXOFF);tset.c_cflag &= ~CRTSCTS;}retval = tcsetattr(serialfd_, TCSANOW, &tset);if (-1 == retval){return false;}return true;}int CUART::send(char* buf, int len, int timeout){struct timeval tv;tv.tv_sec = timeout / 1000; //SECONDtv.tv_usec = (timeout % 1000) * 1000; //USECONDint ret;fd_set writefd;FD_ZERO(&writefd);FD_SET(serialfd_, &writefd);ret = select(serialfd_ + 1, NULL, &writefd, NULL, &tv);if (ret < 0){return ret;}if (ret == 0){return 0;}if (FD_ISSET(serialfd_, &writefd)){return write(serialfd_, buf, len);}return 0;}int CUART::recv(char* buf, int len, int timeout){int ret;struct timeval tv;tv.tv_sec = timeout / 1000; //SECONDtv.tv_usec = (timeout % 1000) * 1000; //USECONDfd_set readfd;FD_ZERO(&readfd);FD_SET(serialfd_, &readfd);ret = select(serialfd_ + 1, &readfd, NULL, NULL, &tv);if (ret > 0 && FD_ISSET(serialfd_, &readfd)){return read(serialfd_, buf, len);}return 0;}

注:代码需要根据相应平台做些修改,下面的结果是我根据自己的平台定制的,经测试可行,无BUG,结果如下:



0 0
原创粉丝点击