极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4617|回复: 0

实现pcDuino和电力载波模块Spyder的AT指令交互

[复制链接]
发表于 2013-12-20 10:21:00 | 显示全部楼层 |阅读模式
                                                                                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
#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;
}
               
       
                       
注意事项:
                                                                                代码的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:串口数据位数查看与设置(参数:5678)。
ATPA:串口奇偶校验设置与查看(参数:N表示无,O表示奇数,E表示偶数)。
ATST:串口停止位设置与查看(参数:1,2)
ATRW:用于调试控制(参数Y/NY打开该功能,输出原始数据,N关闭)。
ATMI:查看与设置对MIO通信方式的支持(参数:Y/N)。
ATSR:搜索电力线上的模块,不带参数。返回收到的模块个数。
ATDT:模块目的地址查看与修改。
ATSN:查看与设置与设置模块的序列号(参数小于十进制:132217727
               
       
                       

               
       
                       





               
       
                       

回复

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-7-16 21:23 , Processed in 0.315283 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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