#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <string.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include "cssl.h"
void *serial(char sdev[20],char *message_buffer) //定义串口数据处理函数,获取串口传送的信息,并且往message_buffer中填写数据
{
unsigned char recvdat[60] = {0}; //接收串口数据的容器
cssl_t *ser; //设置串口句柄,供后面调用
cssl_start(); //启动串口函数
ser=cssl_open(sdev,NULL,0,115200,8,0,1); //打开串口,设置波特率56700B(115200)
if (!ser) //ser为0,则打开串口失败.
printf("%s\n",cssl_geterrormsg());
else //打印串口连接成功信息
printf("Serial connection successful, DEV = %s\n", sdev);
int n; //n用来保存数据长度
n = cssl_getdata(ser,recvdat,60); //从串口读取长度最多为60的数据,返回实际读取到的数据长度
cssl_drain(ser); //等待数据全部送出,防止过快的调用写函数,造成数据丢失。
int i; //设置循环控制变量
for(i = 0; i < n; i++) //屏幕输出接收到的暂存在recvdat的数据
printf("%c",recvdat[i]);
for(i = 0;i < n;i++) //把串口缓冲区里的信息放到
message_buffer[i] = recvdat[i];
message_buffer[i] = '\0'; //把字符串末尾补上结束符,避免越界
printf("\n"); //打印换行符,使得输出更清楚
fflush(stdout); //清空标准输出缓存
return NULL;
}
int main(int argc, char **argv)
{
int sockfd; //定义套接字句柄
char buffer[100]; //定义字符数组
struct sockaddr_in server_addr; //定义socket的服务器地址结构
struct hostent *host; //服务器网络地址信息的结构体
int n;
char *message_buffer = (char*)malloc(100*sizeof(char)); //这个数组用来存放到时候要输出的信息
char sdev[20] = {0}; //sdev数组存放串口设备信息
int switch_current = 1; //循环控制开关
if(argc<2) //参数检测,若没有输入1个以上参数则报错
{
printf("usage: %s dev_path\n",argv[0]);
return -1;
}
else //获取参数传来的设备地址/dev/ttyS*
memcpy(sdev,argv[1],strlen(argv[1]));
sockfd=socket(AF_INET,SOCK_STREAM,0); //创建套接字句柄
if (sockfd==-1) //如果创建套接字失败,返回失败信息
{
perror("socket error"); //输出错误信息
exit(1); //返回-1
}
server_addr.sin_family=AF_INET; //协议族为IPV4
server_addr.sin_port=htons(8000); //主机字节序转换成网络字节序
inet_pton(AF_INET,"192.168.209.1",&server_addr.sin_addr); //IP地址转换函数,把点分十进制和二进制转换
if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr_in))==-1) //如果服务端没有开启,输出连接失败信息,返回-1
{
perror("connect failed"); //连接失败
exit(1);
}
while(switch_current) //用循环控制开关进行检测,判断用户是否还要继续输入数据
{
serial(sdev,message_buffer); //读取串口数据,输出,并且放入
//printf("message_buffer:%s\n",message_buffer); //输出数据
write(sockfd,message_buffer,strlen(message_buffer)); //把message_buffer里的数据写入socket套接字
send(sockfd,message_buffer,strlen(message_buffer),0); //把message_buffer里的数据发送给服务端
printf("if you want to continue,please enter 1,else enter 0\n"); //决定是否要继续传输数据
scanf("%d",&switch_current);
}
close(sockfd); //关闭套接字
return 0;
}