socket-serial通信

#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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值