[ARM问答] 【EVB-335X-II试用体验】EVB-335与51单片机串口通讯

2019-07-16 08:39发布

最近一直在做一个信息采集系统,做了很多实验,都不怎么理想,但我还是选择了用51单片机作为信息采集端,通过串口,51单片机会将采集到的信息发送给EVB_335,硬件连接如图
IMG_20151124_131707.jpg
首先,做一块带串口的51单片机的最小系统板。
IMG_20151124_131720.jpg

将最小系统板与EVB-335用交叉线连接。

将以下代码编译后下载到51单片机,该程序功能为:将51单片机各个IO口采集到的信息通过串口发送出去
  1. #include <reg52.h>


  2. void uart_init()
  3. {
  4.         ET1 = 0;
  5.         TMOD = TMOD & 0X0F;
  6.         TMOD = TMOD | 0X20;
  7.         TH1=TL1=0XFd;
  8.         PCON = 0;
  9.         SCON = 0X40;
  10.         TR1 = 1;
  11. }

  12. uart_delay(int us)
  13. {
  14.         while(us--);
  15. }

  16. void  uart_txdat(char dat)
  17. {
  18.   SBUF = dat;
  19.         while(ti==0);
  20.         TI = 0;
  21. //        uart_delay(50);
  22. }

  23. void main()
  24. {        int j=100;
  25.         uart_init();
  26.         while(1)
  27.         {

  28.         uart_txdat('s');
  29.         uart_txdat(((P0&0xf0)>>4)+48);
  30.         uart_txdat((P0&0x0f)+48);                       
  31.         uart_txdat(((P1&0xf0)>>4)+48);
  32.         uart_txdat((P1&0x0f)+48);
  33.         uart_txdat(((P2&0xf0)>>4)+48);
  34.         uart_txdat((P2&0x0f)+48);
  35.         uart_txdat(((P3&0xf0)>>4)+48);
  36.         uart_txdat((P3&0x0f)+48);
  37.          for(j=5;j>0;j--)
  38.         uart_delay(30000);
  39.         }


  40. }
复制代码同时,编译一下程序下载到EVB-335,该程序的功能为:接收51单片机传来的信息,并将它通过其他串口发送给另外的终端,同时,将接收到的信息写入对应文件,方便使用。
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<malloc.h>
  4. #include<sys/types.h>
  5. #include<sys/stat.h>
  6. #include<fcntl.h>
  7. #include<unistd.h>
  8. #include<termios.h>

  9. #define max_buffer_size 9

  10. int main()
  11. {
  12.         char fd=-1,ffd=-1,fdt=-1;
  13.         volatile char j=0,ret=0;
  14.         char buff[max_buffer_size];
  15.         struct termios opt,opt_tem;
  16.        
  17.         while(1)
  18.         {
  19.                  fd=-1,ffd=-1,fdt=-1;
  20.                 opt = opt_tem;
  21.                 fd=open("/dev/ttySAC3",O_RDWR);  //´ò¿ªµÚÒ»¸ö´®¿Ú
  22.         if(fd<0)
  23.         {
  24.                 printf("dev1 open error!!!");
  25.                 return 0;
  26.         }
  27.                 fdt=open("/dev/ttySAC0",O_RDWR);  //´ò¿ªµÚ¶þ¸ö´®¿Ú
  28.         if(fdt<0)
  29.         {
  30.                 printf("dev2 open error!!!");
  31.                 close(fd);
  32.                 return 0;
  33.         }
  34.         ffd=open("/file/info.txt",O_RDWR,0664);//´ò¿ªÎļþ
  35.         if(ffd<0)
  36.         {
  37.                 printf("info.txt file open failed!!!");
  38.                 close(fd);
  39.                 close(fdt);
  40.                 return 0;
  41.         }
  42.         tcgetattr(fd,&opt);
  43.         tcgetattr(fdt,&opt);
  44.         cfmakeraw(&opt);
  45.         cfsetispeed(&opt,B9600);
  46.         cfsetospeed(&opt,B9600);
  47.         tcsetattr(fd,TCSANOW,&opt);
  48.        
  49.         printf("reday receiving data#### ");
  50.        
  51.                 for(j=0;j<max_buffer_size;j++)
  52.                          {
  53.                 *(buff+j) = ' ';        //Ϊȷ±£³É¹¦½ÓÊÕÊý¾Ý£¬½ÓÊÕ֮ǰ£¬ÏȽ«ÏàÓ¦»º´æÇå
  54.                          }
  55.                 read(fd,buff,sizeof(char));  //²éѯÏÂλ»ú״̬£¬½ÓÊÕµ½¿ªÊ¼ÃüÁîºó¿ªÊ¼½ÓÊպʹ¦ÀíÊý¾Ý
  56.                  if(buff[0] == 's')
  57.                  {
  58.           for(j=1;j<max_buffer_size;j++)
  59.                          {
  60.                 *(buff+j) = ' ';        //Ϊȷ±£³É¹¦½ÓÊÕÊý¾Ý£¬½ÓÊÕ֮ǰ£¬ÏȽ«ÏàÓ¦»º´æÇå¿Õ
  61.                 read(fd,buff+j,sizeof(char));//½ÓÊÕÊý¾Ý
  62.                                  printf("receiv success,char is %c,j value %d ",buff[j],j);
  63.                          }
  64.                
  65.    if(*(buff+j-1) != ' ')
  66.          {
  67.                 //printf("receiv success,string is %s ",buff);
  68.                  for(j=0;j<max_buffer_size;j++)
  69.                  write(fdt,buff+j,sizeof(char));//½«½ÓÊÕµ½µÄÊý¾Ý·¢Ë͸ø¿Í»§»ú
  70.                  lseek(ffd,0,SEEK_SET);  //Îļþ¶¨Î»
  71.                  ret = write(ffd,buff+1,strlen(buff)-1);//½«½ÓÊÕµ½µÄÊý¾Ý±£´æµ½Ö÷»úÎļþ¶ÔӦλÖÃ
  72.                          close(fd);
  73.      close(fdt);
  74.      close(ffd);
  75.                 sleep(1);
  76.                 // if(ret)
  77.                 //break;
  78.          }
  79.        
  80.    }
  81.    
  82. }

  83. return 0;
  84.        
  85. }
复制代码值得注意的是,如果要使用51单片机的P0口,是需要接上拉电阻的,我的这次实验是没有接上拉电阻,所以P0口也是不能作为输入口使用的。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。