5230|6

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Linux下串口设置问题 急!! [复制链接]

我在Linux下编写了一段串口程序,进行数据收发,程序如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

char xCal_crc(char *ptr,int len);
int fd;

#define   _POSIX_SOURCE   1   /*符合POSIX标准的代码*/  

int main( int argc, char **argv)
{
        speed_t BAUDRATE = B115200;                   /*定义串口速率,前面加个B然后是你所需要的速率。*/  
        char *MODEMDEVICE = "/dev/ttyS0";   /*使用COM1进行通讯*/  
        int   res,i;  
        struct   termios   oldios,newios,opt;  
        char   buff[10240];
        char        ACK[5],DAT[1024];
        char *ptr = buff, *ptr2 = buff;

        fd   =   open(MODEMDEVICE,   O_RDWR   |   O_NOCTTY  |  O_NONBLOCK );   /*以读写方式打开串口。使用不要MODEM的直接连接方式。   */  
//        fd   =   open(MODEMDEVICE,   O_RDWR   |   O_NOCTTY  );   /*以读写方式打开串口。使用不要MODEM的直接连接方式。   */  
        if (fd   <   0)   {  
                perror(MODEMDEVICE);
                printf("open uart error!\n");  
                exit(0);  
        }  
        tcgetattr(fd,&oldios);   /*保存当前串口设置*/  
        bzero(&newios,sizeof(newios));   /*清空当前串口设置*/  

/*设置无奇偶校验8N1*/   
        newios.c_cflag &= ~CSIZE;
        newios.c_cflag |= CS8;
        newios.c_cflag &= ~PARENB;
        newios.c_cflag &= ~CSTOPB;
        newios.c_cflag |= CS8;
/*终端为本地连接,忽略MODEM的状态线*/
        newios.c_cflag |= CLOCAL;
        newios.c_cflag |= CREAD;
/*设置非加工方式输入*/
        newios.c_iflag |= IGNPAR;
        newios.c_lflag &= ~( ICANON | ECHO | ISIG | IEXTEN | ECHOE );
        newios.c_iflag &= ~INPCK;
        newios.c_iflag &= ~ICRNL;
        newios.c_iflag &= ~INLCR;
        newios.c_iflag &= ~ISTRIP;
        newios.c_iflag &= ~IXON;
        newios.c_iflag &= ~BRKINT;
/*设置非加工方式输出*/
        newios.c_oflag &= ~OPOST;
/*设置波特率*/
        cfsetispeed( &newios, BAUDRATE );
        cfsetospeed( &newios, BAUDRATE );
/*设置阻塞字节数和等待时间*/
        newios.c_cc[VMIN] = 128;
        newios.c_cc[VTIME] = 2;

        tcflush(fd,TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newios);   /*使端口属性设置生效*/  
        printf("seted !\n");

        int once_read = 0, totle_num = 0, send_num = 0,j;       
        char crc;
        send_num = 0;
        struct timeval tpstart,tpend,a,b;
        float timeuse,wait_val;
        gettimeofday(&tpstart,NULL);
        for( j=0; j<2000; j++ ){
                        ptr = buff;
                        ptr2 = buff;
                        once_read = 0;
                        send_num = 0;
                        gettimeofday(&a,NULL);
                        while(1){
                                once_read = read(fd, ptr, 1024);                               
                                if( once_read != -1 ){
                                        send_num += once_read;
                                        totle_num += once_read;
                                        ptr += once_read;                                       
                                }                               
                                if( send_num >= 1024 )
                                        break;                               
                        }
                        gettimeofday(&b,NULL);
                        wait_val=1000000*(b.tv_sec-a.tv_sec)+b.tv_usec-a.tv_usec;
                        wait_val/=1000000;
                        printf("ACK Used Time:%f\n",wait_val);
                        for( i=0; i<1024; i++ ){
                                DAT = ptr2;
                        }               
                        crc = xCal_crc( DAT, 1024 );
                        if( crc != 0x00 )
                                ACK[0] = 0x00;
                   ACK[0] = DAT[1022] +1;
                        for( i=1; i<4; i++ )
                                ACK = 0xFF;
                        crc = xCal_crc( ACK, 4 );
                        ACK[4] = crc;
                        write( fd, ACK, 5 );
                        for( i=0; i<5; i++ ){
                                printf("%X",ACK);
                        }
                        printf("\n");
        }
        gettimeofday(&tpend,NULL);
        timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
        timeuse/=1000000;
        printf("Used Time:%f\n",timeuse);
        tcsetattr(fd,TCSANOW,&oldios);   /*使端口属性设置恢复*/  
}

我设的波特率是115200,但是实际测的结果是读1K字节的时间差不多在0.09s左右,实际传输速度只有10K,和我设的波特率差距很大,不知道是怎么回事?
请高人指点一下吧!
急 !

最新回复

一直用Linux,Linux环境编程比较舒服。  详情 回复 发表于 2008-5-16 11:57
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
115200bps = 14400Bps
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
pc机程序
  1. /**************************************************
  2. * Serial communication between PC and 51 board
  3. *
  4. * function: A running hores controlled by PC
  5. *                          send one byte data to 51 board every one
  6. *                          second
  7. *
  8. * compile: gcc -o main main.c
  9. * eviroment: ubuntu 7.10
  10. * compiler: gcc
  11. *
  12. * baud: 1200
  13. * parit: N
  14. * databits: 8
  15. * stopbit: 1
  16. ***************************************************/

  17. #include           /*鏍囧噯杈撳叆杈撳嚭瀹氫箟*/
  18. #include          /*鏍囧噯鍑芥暟搴撳畾涔?/
  19. #include          /*Unix 鏍囧噯鍑芥暟瀹氫箟*/
  20. #include       
  21. #include        
  22. #include           /*鏂囦欢鎺у埗瀹氫箟*/
  23. #include         /*PPSIX 缁堢?鎺у埗瀹氫箟*/
  24. #include           /*閿欒?鍙峰畾涔?/

  25. #define FALSE  -1
  26. #define TRUE   0

  27. struct termio
  28. {        unsigned short  c_iflag;        /* 杈撳叆妯″紡鏍囧織 */       
  29.         unsigned short  c_oflag;                /* 杈撳嚭妯″紡鏍囧織 */       
  30.         unsigned short  c_cflag;                /* 鎺у埗妯″紡鏍囧織*/       
  31.         unsigned short  c_lflag;                /* local mode flags */       
  32.         unsigned char  c_line;                    /* line discipline */       
  33.         unsigned char  c_cc[NCCS];    /* control characters */
  34. };

  35. /**
  36. * *@brief  璁剧疆涓插彛閫氫俊閫熺巼
  37. * *@param  fd     绫诲瀷 int  鎵撳紑涓插彛鐨勬枃浠跺彞鏌?
  38. * *@param  speed  绫诲瀷 int  涓插彛閫熷害
  39. * *@return  void
  40. * */
  41. int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
  42.                                         B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  43. int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,  
  44.                                         19200,  9600, 4800, 2400, 1200,  300, };
  45. void set_speed(int fd, int speed){
  46.         int   i;
  47.         int   status;
  48.         struct termios   Opt;
  49.         tcgetattr(fd, &Opt);
  50.         for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {
  51.                 if  (speed == name_arr[i]) {     
  52.                         tcflush(fd, TCIOFLUSH);     
  53.                         cfsetispeed(&Opt, speed_arr[i]);  
  54.                         cfsetospeed(&Opt, speed_arr[i]);   
  55.                         status = tcsetattr(fd, TCSANOW, &Opt);  
  56.                         if  (status != 0) {        
  57.                                 perror("tcsetattr fd1");  
  58.                                 return;     
  59.                         }   
  60.                         tcflush(fd,TCIOFLUSH);   
  61.                 }  
  62.         }
  63. }


  64. /**
  65. * *@brief   璁剧疆涓插彛鏁版嵁浣嶏紝鍋滄?浣嶅拰鏁堥獙浣?
  66. * *@param  fd     绫诲瀷  int  鎵撳紑鐨勪覆鍙f枃浠跺彞鏌?
  67. * *@param  databits 绫诲瀷  int 鏁版嵁浣?  鍙栧??涓?7 鎴栬??
  68. * *@param  stopbits 绫诲瀷  int 鍋滄?浣?  鍙栧?间负 1 鎴栬??
  69. * *@param  parity  绫诲瀷  int  鏁堥獙绫诲瀷 鍙栧?间负N,E,O,,S
  70. * */
  71. int set_Parity(int fd,int databits,int stopbits,int parity)
  72. {
  73.         struct termios options;
  74.         if  ( tcgetattr( fd,&options)  !=  0) {
  75.                 perror("SetupSerial 1");     
  76.                 return(FALSE);  
  77.         }
  78.         options.c_cflag &= ~CSIZE;
  79.         switch (databits) /*璁剧疆鏁版嵁浣嶆暟*/
  80.         {   
  81.         case 7:               
  82.                 options.c_cflag |= CS7;
  83.                 break;
  84.         case 8:     
  85.                 options.c_cflag |= CS8;
  86.                 break;   
  87.         default:   
  88.                 fprintf(stderr,"Unsupported data size\n"); return (FALSE);  
  89.         }
  90. switch (parity)
  91. {   
  92.         case 'n':
  93.         case 'N':   
  94.                 options.c_cflag &= ~PARENB;   /* Clear parity enable */
  95.                 options.c_iflag &= ~INPCK;     /* Enable parity checking */
  96.                 break;  
  97.         case 'o':   
  98.         case 'O':     
  99.                 options.c_cflag |= (PARODD | PARENB); /* 璁剧疆涓哄?鏁堥獙*/  
  100.                 options.c_iflag |= INPCK;             /* Disnable parity checking */
  101.                 break;  
  102.         case 'e':  
  103.         case 'E':   
  104.                 options.c_cflag |= PARENB;     /* Enable parity */   
  105.                 options.c_cflag &= ~PARODD;   /* 杞?崲涓哄伓鏁堥獙*/     
  106.                 options.c_iflag |= INPCK;       /* Disnable parity checking */
  107.                 break;
  108.         case 'S':
  109.         case 's':  /*as no parity*/   
  110.             options.c_cflag &= ~PARENB;
  111.                 options.c_cflag &= ~CSTOPB;break;  
  112.         default:   
  113.                 fprintf(stderr,"Unsupported parity\n");   
  114.                 return (FALSE);  
  115.         }  
  116. /* 璁剧疆鍋滄?浣?/  
  117. switch (stopbits)
  118. {   
  119.         case 1:   
  120.                 options.c_cflag &= ~CSTOPB;  
  121.                 break;  
  122.         case 2:   
  123.                 options.c_cflag |= CSTOPB;  
  124.            break;
  125.         default:   
  126.                  fprintf(stderr,"Unsupported stop bits\n");  
  127.                  return (FALSE);
  128. }
  129. /* Set input parity option */
  130. if (parity != 'n')   
  131.         options.c_iflag |= INPCK;
  132. tcflush(fd,TCIFLUSH);
  133. options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
  134. options.c_oflag  &= ~OPOST;   /*Output*/
  135. options.c_cc[VTIME] = 150; /* 璁剧疆瓒呮椂15 seconds*/   
  136. options.c_cc[VMIN] = 0; /* Update the options and do it NOW */

  137. if (tcsetattr(fd,TCSANOW,&options) != 0)   
  138. {
  139.         perror("SetupSerial 3");   
  140.         return (FALSE);  
  141. }
  142. return (TRUE);  
  143. }



  144. int OpenDev(char *Dev)
  145. {
  146.         int        fd = open( Dev, O_RDWR );         //| O_NOCTTY | O_NDELAY       
  147.         if (-1 == fd)       
  148.         {                        
  149.                 perror("Can't Open Serial Port");
  150.                 return -1;               
  151.         }       
  152.         else       
  153.                 return fd;
  154. }
  155. int main(int argc, char **argv){
  156.         int fd;
  157.         int nread, nwrite;
  158.         unsigned char buff[512];
  159.         char *dev  = "/dev/ttyS0"; //涓插彛1
  160.         fd = OpenDev(dev);
  161.         if ( fd == -1 ){
  162.                 perror("OpenDev");
  163.                 exit(0);
  164.         } else {
  165.                 printf("DevOpened\n");
  166.         }

  167.         set_speed(fd,1200);
  168.         if (set_Parity(fd,8,1,'N') == FALSE)  {
  169.                 printf("Set Parity Error\n");
  170.                 exit (0);
  171.         } else {
  172.                 printf("Parity set successfully\n");
  173.         }

  174.         buff[0] = 0x01;
  175.         while (1)
  176.         {   
  177.                 //nread = read(fd, buff, sizeof(buf));
  178.                 nwrite = write(fd, buff, 1);
  179.                 if ( buff[0] == 0x00 )
  180.                         buff[0] = 0x01;
  181.                 else
  182.                         buff[0] = buff[0] << 1;
  183.                
  184.                 if ( nwrite < 0 ){
  185.                         perror("write");
  186.                 } else {
  187.                         printf("%d bytes written\n", nwrite);
  188.                 }
  189.                 sleep(1);
  190.         }
  191.         close(fd);  
  192.         exit (0);
  193. }
复制代码


51板程序
  1. /*******************************************
  2. * serial communication
  3. * send and receive
  4. *
  5. * written by Manio
  6. * 04/27/08
  7. *
  8. * PC settings:
  9. *    baud: 1200
  10. *    parit: N
  11. *    databits: 8
  12. *    stopbit: 1
  13. *
  14. * BUG:
  15. *    send or receive process may be interrupted
  16. *    by receive or send interput ,and confuse
  17. *    data appear
  18. *******************************************/


  19. #include

  20. void send_char_com(unsigned char ch) ;
  21. void delay( void );


  22. int main( void )
  23. {

  24.         SP = 0x50;
  25.     TMOD = 0x20;
  26.     SCON = 0x50;
  27.     TH1 = 0xE6;
  28.         TL1 = 0xE6;
  29.         EA = 1;
  30.     ES = 1;
  31.     TR1 = 1;

  32.         while (1){
  33.                 send_char_com( 0x83 );
  34.                 delay();
  35.         }
  36.         return 0;
  37. }

  38. void delay( void )
  39. {
  40.         int i;
  41.         for ( i = 0; i < 10000; ++i );
  42. }

  43. void serial_rev( void ) interrupt 4
  44. {
  45.         P1 = SBUF;
  46.         RI = 0;
  47. }

  48. //向串口发送一个字符
  49. void send_char_com(unsigned char ch)  
  50. {
  51.     SBUF=ch;                                                                                  
  52.         //TI will be set and a interrupt will be requested after one frame is sent
  53.         //TI must be clear after sending
  54.     while(TI==0);
  55.     TI=0;
  56. }
复制代码
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

4
 
是哦~~呵呵不好意思让大家见笑了:P
对了顺便再问一下Linux下面串口能支持的最大速率是多少?我把波特率设置为B460800后传输速度没有提高呀?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
lz,我也需要一个串口发送的代码。。
如果你测试成功了,可以给我一份么。。谢了
邮箱:monkey.sh@hotmail.com
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习了!mark……
unix下编的?注释都是乱码……
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
一直用Linux,Linux环境编程比较舒服。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表