【USB开发】实现pcDuino和spyder的AT指令交互-Arduino中文社区 - Powered by Discuz! Archiver

土豆变薯条 发表于 2013-12-9 16:29

【USB开发】实现pcDuino和spyder的AT指令交互

一:实验装置
         spyder装上RS232后,通过usb转串口线连接pcduino的USB口。
   spyder和pcduino都接上电源

二:实验代码
           #include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <fcntl.h>
   #include <termios.h>
   #include <errno.h>
   #include <pthread.h>
   #include <string.h>
   #define FALSE -1
   #defineTRUE 0
   pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
   pthread_mutex_t wlock = PTHREAD_MUTEX_INITIALIZER;
   void set_speed(int fd, int speed){
   struct termios opt;
   tcgetattr(fd,&opt);
   tcflush(fd,TCIOFLUSH);
   cfsetispeed(&opt,speed);
   cfsetospeed(&opt,speed);
   tcflush(fd,TCIOFLUSH);
   }
   int set_parity(int fd,int databits,int stopbits,int parity){
   struct termios options;
   if(tcgetattr(fd,&options)!=0){
   perror(“Serial 1″);
   return (FALSE);
   }
   tcflush(fd,TCIFLUSH);
   options.c_cflag |= (CLOCAL| CREAD);
   options.c_cflag &= ~PARENB;
   options.c_cflag &= ~CSTOPB;
   options.c_cflag &= ~CSIZE;
   options.c_cflag &= CS8;
   options.c_cflag |= (CLOCAL | CREAD);
   options.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
   options.c_oflag &= ~OPOST;
   options.c_oflag & ~(ONLCR | OCRNL);
   options.c_iflag &= ~(ICRNL|INLCR);
   options.c_iflag &= ~(IXON|IXOFF|IXANY);
   tcflush(fd,TCIFLUSH);
   options.c_cc = 150;
   options.c_cc = 0;
   if(tcsetattr(fd,TCSANOW,&options)!= 0){
   perror(“tcsetattr fd”);
   return FALSE;
   }
   return TRUE;
   }
   int opendev(char *dev){
   int fd=open(dev,O_RDWR|O_NONBLOCK);
   if(FALSE ==fd){
   perror(“open”);
   return (FALSE);
   }
   else return fd;
   }
   void *recFun(void *args){
   pthread_mutex_lock(&lock);
   printf(“recFun_thread begin!\n”);
   char buff;
   int nread;
   int *fd = (int *)(((void**)args));
   // printf(“fd = %d”,*fd);
   while(1){
   if((nread = read(*fd,buff,512))> 0){
   // printf(“\nLen %d\n”,nread);
   buff = ”;
   printf(“\n———————–\n”);
   printf(“%s”,buff);
   printf(“\n———————–\n”);
   memset(buff,0,sizeof(char)*512);
   sleep(1);
   }
   }
   pthread_mutex_unlock(&lock);
   }
   void *sendFun(void *args){
   pthread_mutex_lock(&wlock);
   printf(“send_thread begin!\n”);
   int *fd = (int *)(((void**)args));
   write(*fd,”+++”,3);
   printf(“+++ have sent\n”);
   sleep(1);
   write(*fd,”ATSN\n”,5);
   printf(“ATSN have sent\n”);
   sleep(1);
   write(*fd,”520linksprite!\n”,15);
   printf(“520linksprite have send!\n”);
   pthread_mutex_unlock(&wlock);
   }
   int main(){
   int fd;
   char dev = ”/dev/ttyUSB0″;
   fd = opendev(dev);
   printf(“fd = %d\n”,fd);
   set_speed(fd,9600);
   if(set_parity(fd,8,1,’N') == FALSE){
   printf(“Set Parity Error\n”);
   exit(0);
   }
   void *arg[]= {&fd};
   pthread_t pid1,pid2;
   pthread_create(&pid1,NULL,recFun,arg);
   pthread_create(&pid2,NULL,sendFun,arg);
   pthread_join(pid1,NULL);
   pthread_join(pid2,NULL);
   close (fd);
   pthread_mutex_destroy(&lock);
   pthread_mutex_destroy(&wlock);
   return 0;
   }
   


三:注意事项
         代码的main函数中数组dev存储的是设备文件名。
   不同的usb口对应着不同的设备文件名,可以在终端串口下输入“ls /dev/ttyUSB*”,查看所有的USB设备文件。
   然后拔下pcduino和spyder连接的USB口,再次输入“ls /dev/ttyUSB*”看看少了那个USB设备文件。
   那么那个消失的就是spyder对应的设备文件。
   


四:实验结果和说明
         发送“+++”后进入AT指令模式,此时spyder会返回一个“OK”
   在指令模式中发送“ATSN”,查看spyder设备号,此例中是633
   发送错误指令“520linksprite”,spyder返回”invalid cmd”提示错误
   十五秒不发送指令,spyder返回“exited”退出AT指令模式

五:附录

          AT指令操作详情。
   指令格式:“ATXX”+“空格”+“参数”+“换行符”(指令带参数)
   “ATXX” +“换行符”(指令不带参数)
   当指令带有多个参数时各参数之间用逗号隔开.
   ATEX :让模块退出AT指令模式,进入数据转发模式。(注:进入AT指令模式后,若在15S内没有收到数据模块将自动退出AT指令模式)
   ATTO:查看或设置模块在进入AT指令模式后在自动退出该模式前所等待的时间。指令带参数将修改该参数,不带参数时模块将自身该参数从串口发送出来。
   ATRS:软件重启指令,不带参数。
   ATDA:模块domain地址配置与查询。
   ATNA:模块node地址配置与查询。
   ATRP:显示当前中继状态, Y 为开, N为关。(目前只带参数“N”关闭中继功能)。
   ATNM:查看设置模块名称。(参数长度小于15)。
   ATBD:串口波特率设置与查看(参数:1200, 2400, 4800, 9600, 19200 )。
   ATDB:串口数据位数查看与设置(参数:5,6,7,8)。
   ATPA:串口奇偶校验设置与查看(参数:N表示无,O表示奇数,E表示偶数)。
   ATST:串口停止位设置与查看(参数:1,2)。
   ATRW:用于调试控制(参数Y/N,Y打开该功能,输出原始数据,N关闭)。
   ATMI:查看与设置对MIO通信方式的支持(参数:Y/N)。
   ATSR:搜索电力线上的模块,不带参数。返回收到的模块个数。
   ATDT:模块目的地址查看与修改。
   ATSN:查看与设置与设置模块的序列号(参数小于十进制:132217727)
   


帖子出自:http://cnlearn.linksprite.com/?p=1632


szchenwei 发表于 2013-12-9 16:56

spyder比较少见,LZ弄些pcduino-Arduino交互通信的例程吧
页: [1]
查看完整版本: 【USB开发】实现pcDuino和spyder的AT指令交互