Chinaunix首页 | 论坛 | 博客
  • 博客访问: 72163
  • 博文数量: 64
  • 博客积分: 165
  • 博客等级: 入伍新兵
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-15 22:23
文章分类
文章存档

2013年(4)

2012年(60)

我的朋友

分类:

2012-12-30 21:38:43

原文地址:多个串口测试 作者:linuxfx

   最近测试了一下我们公司apus板子的串口,看多个串口同时使用会不会有问题。所以就在网上找了一个例子,自己再改了一下。现在代码如下:
   实现同时对串口uart1,uart2,uart3同时进行写操作。
 
#include        /*标准输入输出定义*/
#include       /*标准函数库定义*/
#include       /*Unix标准函数定义*/
#include 
#include 
#include        /*文件控制定义*/
#include      /*PPSIX终端控制定义*/
#include        /*错误号定义*/
#include 
#include
#define   COM1  "/dev/ttyS1"
#define   COM2  "/dev/ttyS2"
#define   COM3  "/dev/ttyS3"
#define   FAILURE   -1
#define   SUCCESS    0
#define   BUFF_SIZE  512
int rate_arr[] = {B57600, B38400, B19200, B9600, B2400};
int name_arr[] = { 57600, 38400,  19200, 9600, 2400 };
int serial_open (int& fd, char *pSerial)
{
 fd = open (pSerial, O_RDWR);
 if (FAILURE == fd)
 {
  perror ("Cannot open Serial!\n");
  return  FAILURE;
 }
    else
        printf("Open %s success!\n",pSerial);
 return SUCCESS;
}
int serial_speed_set (int& fd, int nBaud)
{
 int i, status;
 struct termios  opt;
 if ((i=tcgetattr (fd, &opt)) != SUCCESS)
 {
  perror("Cannot get speed status!\n");
  return FAILURE;
 }
  
 for (i=0; i< (sizeof(rate_arr)/sizeof(rate_arr[0])); i++)
 {
  if (nBaud == name_arr[i])
  {
   tcflush (fd, TCIOFLUSH);
   cfsetispeed (&opt, rate_arr[i]);
   cfsetospeed (&opt, rate_arr[i]);
   status = tcsetattr (fd, TCSANOW, &opt);
   if (status != SUCCESS)
   {
    perror ("Baud setting error!\n");
    return FAILURE;
   }
   tcflush (fd, TCIOFLUSH);
  }
 }
 return SUCCESS;
}
int serial_parity_set (int& fd, int databits, int stopbits, int parity)
{
 struct  termios  options;
 if (tcgetattr(fd, &options) != SUCCESS)
 {
  perror ("tcgetattr error!\n");
  return FAILURE;
 }
 options.c_cflag &= ~CSIZE;
 switch (databits)
 {
  case 7:
   options.c_cflag |= CS7;
   break;
  case 8:
   options.c_cflag |= CS8;
   break;
  default:
   fprintf (stderr, "Unsupported data size\n");
   return FAILURE;
 }
 switch (parity)
 {
  case 'n':
  case 'N':
   options.c_cflag &= ~PARENB;
   options.c_iflag &= ~INPCK;
   break;
  case 'o':
  case 'O':
   options.c_cflag |= (PARENB|PARODD);
   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:
   fprintf (stderr, "Unsupported parity\n");
   return FAILURE;
 }
 
 switch (stopbits)
 {
  case 1:
   options.c_cflag &= ~CSTOPB;
   break;
  case 2:
   options.c_cflag |= CSTOPB;
   break;
  default:
   fprintf (stderr, "Unsupported stop bits\n");
   return FAILURE;
 }
 /*set input parity option*/
 if (parity != 'n')
  options.c_iflag |= INPCK;
 tcflush (fd, TCIFLUSH);
 options.c_cc[VTIME] = 150;
 options.c_cc[VMIN] = 0;
 options.c_lflag &=~(ICANON|ECHO|ECHOE|ISIG);
 options.c_oflag&=~OPOST;
 if (tcsetattr(fd, TCSANOW, &options) != SUCCESS)
 {
  perror ("set parity error!\n");
  return FAILURE;
 }
 return SUCCESS;
}
int serial_write (int& fd,char *pBuf,int nLength)
{
 //int nLength;
 int nByte;
 
 nByte = write (fd, pBuf, nLength);
 if (nByte>0)
  return nByte;
 return FAILURE;
}
int serial_read (int& fd, char *pBuf, int nLength)
{
 int nByte =0;
 nByte = read (fd, pBuf, nLength);
 return nByte;
}
int serial_close (int& fd)
{
 if (!close (fd))
 {
  perror ("Cannot close serial!\n");
  return FAILURE;
 }
 return SUCCESS;
}
int  main (void)
{
 int fd_com1,fd_com2,fd_com3;
 int nRead = 0;
 char buff[BUFF_SIZE] = {0};
 int   nTotal= 0;
 //FILE *fp = NULL;
 
    //COM1
 if (serial_open (fd_com1, COM1) == FAILURE)
  return 0;
 if (serial_speed_set (fd_com1, 57600) == FAILURE)
  return 0;
 if (serial_parity_set (fd_com1, 8, 1, 'n') == FAILURE)
  return 0;
    //COM2
    if (serial_open (fd_com2, COM2) == FAILURE)
  return 0;
 if (serial_speed_set (fd_com2, 57600) == FAILURE)
  return 0;
 if (serial_parity_set (fd_com2, 8, 1, 'n') == FAILURE)
  return 0;
    //COM3
    if (serial_open (fd_com3, COM3) == FAILURE)
  return 0;
 if (serial_speed_set (fd_com3, 57600) == FAILURE)
  return 0;
 if (serial_parity_set (fd_com3, 8, 1, 'n') == FAILURE)
  return 0;
   
 
 char pszCon[20] = "***ok****!";
 char pszBuf[20] = {0};
 int nCmdLen = 20;
 int nLen = 0;
    printf("Start write content");
   
 while (true)
 {
  //memset(pszCon, 0, 20);
  //memset(pszBuf, 0, 20);
        nCmdLen = strlen(pszCon);
       
  serial_write(fd_com1, pszCon, nCmdLen);
        serial_write(fd_com2, pszCon, nCmdLen);
        serial_write(fd_com3, pszCon, nCmdLen);
  sleep(1);
 }
 
 //fclose (fp);
 serial_close (fd_com1);
 serial_close (fd_com2);
 serial_close (fd_com3);
   
    return 0;
}
阅读(551) | 评论(0) | 转发(0) |
0

上一篇:qt/embedded

下一篇:C反汇编调试的一些技巧

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