串口初始化

串口初始化:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include "type_def.h"

#define MAX_BUFFER_SIZE 100	 /* buff size */
char buffRcvData[MAX_BUFFER_SIZE] = {0};

int fd, s;

//int openPort(void)
//{
//	int fd;
//
//	fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NONBLOCK);//O_NONBLOCK设置为非阻塞模式,在read时不会阻塞住,在读的时候将read放在while循环中
//	if(fd == -1)
//	{
//		perror("Can't Open SerialPort");
//	}
//
//	return fd;
//}

int openPort(int lcomPort)
{
	int fd = 0;
    char *dev[] = {"/dev/ttyUSB0","/dev/ttyS1","/dev/ttyS2"};

    if (lcomPort == 1)//串口1
    {
    	fd = open(dev[0], O_RDWR | O_NOCTTY | O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
     }
     else if(lcomPort == 2)//串口2
     {
    	fd = open(dev[1], O_RDWR | O_NOCTTY | O_NDELAY); 	//没有设置<span style="font-family: Arial, Helvetica, sans-serif;">O_NONBLOCK非阻塞模式,也可以设置为非阻塞模式
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
     }
     else if (lcomPort == 3)//串口3
     {
    	fd = open(dev[2], O_RDWR | O_NOCTTY | O_NDELAY);

        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
     }
     /*恢复串口为阻塞状态*/
     if(fcntl(fd, F_SETFL, 0) < 0)
            printf("fcntl failed!\n");
     else
        printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
     /*测试是否为终端设备*/
     if(isatty(STDIN_FILENO) == 0)
        printf("standard input is not a terminal device\n");
     else
        printf("isatty success!\n");
     printf("fd-open = %d\n",fd);

     return fd;
}

//set port option
int setPortOption(int fd, int lSpeed, int lBits, char ucEvent, int lStop)
{
     struct termios stNewTio, stOldTio;
/*保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息*/
     if  (tcgetattr(fd, &stOldTio) != 0) {
    	 perror("SetupSerial 1");
    	 printf("tcgetattr( fd,&oldtio) -> %d\n",tcgetattr(fd, &stOldTio));
    	 return -1;
     }
     memset(&stNewTio, 0, sizeof(stNewTio));
/*步骤一,设置字符大小*/
     stNewTio.c_cflag |=  CLOCAL | CREAD;
     stNewTio.c_cflag &= ~CSIZE;
/*设置停止位*/
     switch(lBits)
     {
     	 case 7 : stNewTio.c_cflag |= CS7; break;
     	 case 8 : stNewTio.c_cflag |= CS8; break;
     }
/*设置奇偶校验位*/
     switch(ucEvent)
     {
     	 case 'o':
     	 case 'O':	 //奇数
     		 stNewTio.c_cflag |= PARENB;
     		 stNewTio.c_cflag |= PARODD;
     		 stNewTio.c_iflag |= (INPCK | ISTRIP);
			 break;
     	 case 'e':
     	 case 'E':	 //偶数
     		 stNewTio.c_iflag |= (INPCK | ISTRIP);
     		 stNewTio.c_cflag |= PARENB;
     		 stNewTio.c_cflag &= ~PARODD;
     		 break;
     	 case 'n':
     	 case 'N':	//无奇偶校验位
     		 stNewTio.c_cflag &= ~PARENB;
     		 break;
     	 default:
     		 break;
     }
     /*设置波特率*/
     switch(lSpeed)
     {
     	 case 2400:
     		 cfsetispeed(&stNewTio, B2400);
     		 cfsetospeed(&stNewTio, B2400);
     		 break;
     	 case 4800:
     		 cfsetispeed(&stNewTio, B4800);
     		 cfsetospeed(&stNewTio, B4800);
     		 break;
     	 case 9600:
     		 cfsetispeed(&stNewTio, B9600);
     		 cfsetospeed(&stNewTio, B9600);
     		 break;
     	 case 115200:
     		 cfsetispeed(&stNewTio, B115200);
     		 cfsetospeed(&stNewTio, B115200);
     		 break;
     	 case 460800:
     		 cfsetispeed(&stNewTio, B460800);
     		 cfsetospeed(&stNewTio, B460800);
     		 break;
     	 default:
     		 cfsetispeed(&stNewTio, B9600);
     		 cfsetospeed(&stNewTio, B9600);
     		 break;
     }
/*设置停止位*/
     if(lStop == 1)
    	 stNewTio.c_cflag &=  ~CSTOPB;
     else if (lStop == 2)
    	 stNewTio.c_cflag |=  CSTOPB;
/*设置等待时间和最小接收字符*/
     stNewTio.c_cc[VTIME]  = 0;
     stNewTio.c_cc[VMIN] = 0;
/*处理未接收字符*/
     tcflush(fd, TCIFLUSH);
/*激活新配置*/
     if((tcsetattr(fd, TCSANOW, &stNewTio)) != 0)
     {
    	 perror("com set error");
    	 return -1;
     }
     printf("set done!\n");

     return 0;
}

int ReadDataFromTty(int fd, uint8 *pRcvBuf, int Len)
{
//    int retval;
//    fd_set rfds;
    int ret, pos = 0;
//    struct timeval tv;

//    tv.tv_sec  = TimeOut / 1000;  		//set the rcv wait time
//    tv.tv_usec = TimeOut % 1000 * 1000;  //100000us = 0.1s

    while (1)
    {
//        FD_ZERO(&rfds);
//        FD_SET(fd, &rfds);
//        retval = select(fd + 1, &rfds, NULL, NULL, &tv);
//        if(retval == -1)
//        {
//            perror("select()");
//            break;
//        }
//        else if(retval)
//        {
            ret = read(fd, pRcvBuf, 1);
            //printf("pRcvBuf = %c\r\n", pRcvBuf[0]);
            if (ret == -1) break;
            pos++;
            if (Len <= pos) break;
//        }
//        else  break;
    }

    return pos;
}


int SendDataToTty(int fd, uint8 *pSendBuf, int len)
{
    ssize_t ret;

    ret = write(fd, pSendBuf, len);
    if (ret == -1)
    {
        printf("write device error\n");
        return -1;
    }

    return 0;
}

int PortInit(void)
{
    int lSetOpt = 0;	//SetOpt 的增量i

    //serialInit();
    //send_data_tty(SerFd, "hello series\n", sizeof("hello series\n"));

    int fdSerial = 0;

    //openPort
    if((fdSerial = openPort(2)) < 0)	//1--"/dev/ttyS0",2--"/dev/ttyS1",3--"/dev/ttyS2",4--"/dev/ttyUSB0" 小电脑上是2--"/dev/ttyS1"
    {
        perror("open_port error");
        return -1;
    }
    //setOpt(fdSerial, 9600, 8, 'N', 1)
    if((lSetOpt = setPortOption(fdSerial, 115200, 8, 'N', 1)) < 0)
    {
        perror("set_opt error");
        return -1;
    }
    printf("Serial fdSerial=%d\n", fdSerial);

    tcflush(fdSerial, TCIOFLUSH);	//清掉串口缓存
    fcntl(fdSerial, F_SETFL, 0);

    return fdSerial;
}

//EXPORT_SYMBOL(sendDataTty);
//EXPORT_SYMBOL(readDataTty);

//int main(int argc, char** argv)
//{
//	int fdSerial = PortInit();
//
//    unsigned int readDataNum = 0;
//
//    buffRcvData[0] = 's';
//    buffRcvData[1] = 't';
//    buffRcvData[2] = 'a';
//    buffRcvData[3] = 'r';
//    buffRcvData[4] = 't';
//
//    sendDataTty(fdSerial, buffRcvData, 5);
//    while (1){
//        readDataNum = readDataTty(fdSerial, buffRcvData, rcvTimeOut, buffLen);
//        sendDataTty(fdSerial, buffRcvData, readDataNum);
//    }
//
//    return 1;
//}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值