串口初始化:
#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;
//}