📄 rmote.c
字号:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
/* Serial port information for talking to the mote */
#define TOS_PACKET_LENGTH 36 /* Default TOS packet length */
#define SERIAL_PORT "/dev/tts/2" /* Default serial port to use */
//#define SERIAL_PORT "/dev/ttyS2" /* Default serial port to use */
#define MICA1_BAUDRATE B19200 /* MICA1 baudrate */
#define MICA2_BAUDRATE B57600 /* MICA2 baudrate */
#define DEFAULT_BAUDRATE B57600 /* Default is MICA2 */
#define SERVPORT 3333
#define MAXDATASIZE 100
/* Functions */
void usage (char *);
void parse_opts (int, char **); /* Parse command line options */
void open_serial (void); /* Open a serial channel to mote */
void read_packet (void); /* Read a packet from the mote */
void create_packet(char *); /* Create TOS packet */
void write_packet(void); /* Write a packet to the mote */
void print_packet (char *); /* Print mote packet to stdout */
/* Global variables */
int inout_stream;
char input_buffer[TOS_PACKET_LENGTH];
char buf[TOS_PACKET_LENGTH];
char output_buffer[TOS_PACKET_LENGTH];
char *serial_port = SERIAL_PORT;
char mote = 2, charflag = 0;
void usage(char *name) {
fprintf(stderr,"Usage: %s [-h] [-c] [-m 1|2] [-p /dev/ttySXXX]\n",name);
fprintf(stderr," -c : Print packet data as char (default is int)\n");
fprintf(stderr," -m 1 : Use BAUDRATE settings for MICA1\n");
fprintf(stderr," -m 2 : Use BAUDRATE settings for MICA2 (default)\n");
fprintf(stderr," -p /dev/ttySXXX : Talk to mote on /dev/ttySXXX (default is /dev/ttyS2)\n");
fprintf(stderr," -h : Print usage information\n");
exit(-1);
}
void parse_opts(int argc,char **argv) {
int opt;
while ((opt = getopt(argc,argv,"hcm:p:")) != EOF) {
switch(opt) {
case 'h':
usage(argv[0]);
break;
case 'c':
charflag = 1;
break;
case 'm':
mote = atoi(optarg);
if ((mote != 1) && (mote != 2))
usage(argv[0]);
break;
case 'p':
serial_port = optarg;
break;
default:
usage(argv[0]);
}
}
}
int main(int argc, char ** argv) {
int index = 0, count = 10;
int sockfd,sendbytes,i;
struct sockaddr_in serv_addr;
/* Parse command line arguments */
parse_opts(argc,argv);
/* Open serial channel to mote */
open_serial();
while (index < count) {
/* Create the TOS packet. */
create_packet("The first (TOS_PACKET_LENGTH-7) characters of this string form the outgoing TOS packet data");
/* Write the output buffer to the mote */
write_packet();
/* Read packet from mote into input buffer */
/* Note: The read blocks till a mote packet is received.
An alternative is to use "poll" to check for incoming data */
read_packet();
/* Dump packet onto stdout */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket");
exit(1);
}
/*设置sockaddr_in 结构体中相关参数*/
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&(serv_addr.sin_zero),8);
/*调用connect函数主动发起对服务器端的连接*/
if(connect(sockfd,(struct sockaddr *)&serv_addr,\
sizeof(struct sockaddr))==-1){
perror("connect");
exit(1);
}
for(i = 0; i < TOS_PACKET_LENGTH; i ++) {
if (charflag)
buf[i]=(char) (input_buffer[i] & 0xff);
else
buf[i]=(char) (input_buffer[i] & 0xff);
}
/*发送消息给服务器端*/
if((sendbytes=send(sockfd,buf,TOS_PACKET_LENGTH,0))==-1){
perror("send");
exit(1);
}
close(sockfd);
index++;
}
exit(0);
}
/* Open serial channel to mote */
void open_serial() {
struct termios tio;
inout_stream = open(serial_port, O_RDWR|O_NOCTTY);
if (inout_stream < 0) {
fprintf(stderr,"Cannot open serial device %s\n", serial_port);
exit(-1);
}
/* Serial port setting */
bzero(&tio, sizeof(tio));
tio.c_iflag &= ~(IGNPAR | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
tio.c_cflag &= ~(CSIZE | PARENB);
if (mote == 1)
tio.c_cflag |= MICA1_BAUDRATE | CS8 | CLOCAL | CREAD;
else if (mote == 2)
tio.c_cflag |= MICA2_BAUDRATE | CS8 | CLOCAL | CREAD;
else
tio.c_cflag |= DEFAULT_BAUDRATE | CS8 | CLOCAL | CREAD;
/* Raw output_file */
tio.c_oflag &= ~OPOST;
tio.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
/* Flush buffer; parameters take effect immediately */
tcflush(inout_stream, TCIFLUSH);
tcsetattr(inout_stream, TCSANOW, &tio);
/* Enable non-blocking IO */
fcntl(inout_stream, F_SETFL, O_NONBLOCK);
}
/* Read TOS packet from mote */
void read_packet() {
int count;
bzero(input_buffer, TOS_PACKET_LENGTH);
//Find start of packet
while(input_buffer[0] != (char)(0x7E)){
while(1 != read(inout_stream, input_buffer, 1)){};
}
count = 1;
//Read packet contents
while(count < TOS_PACKET_LENGTH)
count += read(inout_stream, input_buffer + count, TOS_PACKET_LENGTH - count);
}
/* Print packet to stdout
void print_packet(char *packet) {
int i;
printf("Raw TOS packet contents: ");
for(i = 0; i < TOS_PACKET_LENGTH; i ++) {
if (charflag)
printf("%c ", (char) (packet[i] & 0xff));
else
printf("%d ", (char) (packet[i] & 0xff));
}
printf("\n");
}
*/
/*socket(int argc,char *argv[]){
int sockfd,sendbytes;
struct hostent *host;
struct sockaddr_in serv_addr;
/*创建socket*/
/* if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket");
exit(1);
}
/*设置sockaddr_in 结构体中相关参数*/
/* serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&(serv_addr.sin_zero),8);
/*调用connect函数主动发起对服务器端的连接*/
/* if(connect(sockfd,(struct sockaddr *)&serv_addr,\
sizeof(struct sockaddr))==-1){
perror("connect");
exit(1);
}
/*发送消息给服务器端*/
/* if((sendbytes=send(sockfd,input_buffer,TOS_PACKET_LENGTH,0))==-1){
perror("send");
exit(1);
}
close(sockfd);
}*/
/* Create TOS packet to send to mote */
void create_packet(char *message) {
/* Setup packet header information */
output_buffer[0] = 0xff; //Destination address
output_buffer[1] = 0xff; //Destination address
output_buffer[2] = 0x0a; //AM type
output_buffer[3] = 0x7d; //AM group
output_buffer[4] = TOS_PACKET_LENGTH-7;//Payload length
/* Fill packet data */
output_buffer[5] = '\0';
strncat(output_buffer,message, TOS_PACKET_LENGTH-7);
/* CRC bytes */
output_buffer[TOS_PACKET_LENGTH-2] = 0xff;
output_buffer[TOS_PACKET_LENGTH-1] = 0xff;
}
/* Send packet to mote */
void write_packet() {
int i;
i = write (inout_stream, output_buffer, TOS_PACKET_LENGTH);
if (i != TOS_PACKET_LENGTH)
fprintf(stderr,"UART send screwed up!\n");
else
fprintf(stderr,"Packet sent to mote over UART.\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -