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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5509|回复: 1

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

[复制链接]
发表于 2013-12-9 16:29 | 显示全部楼层 |阅读模式
一:实验装置
           spyder装上RS232后,通过usb转串口线连接pcduino的USB口。
     spyder和pcduino都接上电源
lianjie2.jpg
二:实验代码
       [mw_shl_code=c,true]    #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
     #define  TRUE 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[VTIME] = 150;
     options.c_cc[VMIN] = 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[512];
     int nread;
     int *fd = (int *)(((void**)args)[0]);
     // printf(“fd = %d”,*fd);
     while(1){
     if((nread = read(*fd,buff,512))> 0){
     // printf(“\nLen %d\n”,nread);
     buff[nread+1] = ”;
     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)[0]);
     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[50] = ”/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;
     }
   [/mw_shl_code]
  

三:注意事项
           代码的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指令模式
jieguo.jpg
五:附录

          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:串口数据位数查看与设置(参数:5678)。
     ATPA:串口奇偶校验设置与查看(参数:N表示无,O表示奇数,E表示偶数)。
     ATST:串口停止位设置与查看(参数:1,2)
     ATRW:用于调试控制(参数Y/NY打开该功能,输出原始数据,N关闭)。
     ATMI:查看与设置对MIO通信方式的支持(参数:Y/N)。
     ATSR:搜索电力线上的模块,不带参数。返回收到的模块个数。
     ATDT:模块目的地址查看与修改。
     ATSN:查看与设置与设置模块的序列号(参数小于十进制:132217727
   
  

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


发表于 2013-12-9 16:56 | 显示全部楼层
  spyder比较少见,LZ弄些pcduino-Arduino交互通信的例程吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:50 , Processed in 0.161509 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表