【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
spyder比较少见,LZ弄些pcduino-Arduino交互通信的例程吧
页:
[1]