TCP 客户端串口收发代码


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
//#include <Windows.h>
#include <pthread.h>
#include <malloc.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <netdb.h>


#include <sys/time.h>

#include <signal.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>


//串口通用初始化函数
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newtio,oldtio;//定义结构体newtio和oldtio
    //将原串口的数据取到oldtio
    if  ( tcgetattr( fd,&oldtio)  !=  0) { 
        perror("SetupSerial 1");
        return -1;
    }
    //将newio清零和设置c_cflag
    bzero( &newtio, sizeof( newtio ) );
    newtio.c_cflag  |=  CLOCAL | CREAD;//使能接收和忽略控制线
    newtio.c_cflag &= ~CSIZE;
    //设置数据位
    switch( nBits )
    {
        case 7:
            newtio.c_cflag |= CS7;
            break;
        case 8:
            newtio.c_cflag |= CS8;
            break;
    }
    //设置校验位
    switch( nEvent )
    {
        //偶校验
        case 'O':
            newtio.c_cflag |= PARENB;//使能奇偶校验
            newtio.c_cflag |= PARODD;//偶校验
            newtio.c_iflag |= (INPCK | ISTRIP);//输入校验并忽略第八位
            break;
        case 'E': 
            newtio.c_iflag |= (INPCK | ISTRIP);
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;//取消偶校验(置零偶校验位),开启奇校验
            break;
        case 'N':  
            newtio.c_cflag &= ~PARENB;//不进行奇偶校验
            break;
    }
    //设置波特率
    switch( nSpeed )
    {
        case 2400:
            cfsetispeed(&newtio, B2400);
            cfsetospeed(&newtio, B2400);
            break;
        case 4800:
            cfsetispeed(&newtio, B4800);
            cfsetospeed(&newtio, B4800);
            break;
        case 9600:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
        case 115200:
            cfsetispeed(&newtio, B115200);
            cfsetospeed(&newtio, B115200);
            break;
        case 460800:
            cfsetispeed(&newtio, B460800);
            cfsetospeed(&newtio, B460800);
            break;
        default:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
    }
    //设置停止位
    if( nStop == 1 )
        newtio.c_cflag &=  ~CSTOPB;//一位停止位
    else if ( nStop == 2 )
        newtio.c_cflag |=  CSTOPB;//两位停止位

    newtio.c_cc[VTIME]  = 0;//不设置读取超时
    newtio.c_cc[VMIN] = 0;//读取最小字符数为0

    tcflush(fd,TCIFLUSH);//清空缓冲区
    
    //使配置生效
    if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    {
        perror("com set error");
        return -1;
    }
    //    printf("set done!\n\r");
    return 0;
}

int sockfd;

#define SERVER_IP    "192.168.43.121"
//#define SERVER_IP    "127.0.0.1"

#define SERVER_PORT    5555

void printf_hex(char *buf, int len)
{
    int i;
    for(i = 0; i < len; i++)
    {
        printf("0x%x ", buf[i]);
    }

    
}


int main(void)
{
    char command[1024];
    char *str;
    /*    连接者的主机信息 */
    struct sockaddr_in their_addr;    

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        /*    如果socket()调用出现错误则显示错误信息并退出 */
        perror("socket");
//        exit(1);
    }

    /*    主机字节顺序 */
    their_addr.sin_family = AF_INET;
    /*    网络字节顺序,短整型 */
    their_addr.sin_port = htons(SERVER_PORT);
    their_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    /*    将结构剩下的部分清零*/
    bzero(&(their_addr.sin_zero), 8);
    if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
    {
        /*    如果connect()建立连接错误,则显示出错误信息,退出 */
        perror("connect");
        exit(1);
    }

    
    int fd,nByte;
    char *uart3 = "/dev/ttyS0";
    
 
openuart:
    if((fd=open(uart3,O_RDWR,0777))<0)
    {
        printf("failed\n");
        
        goto openuart;
    }
    else{
        printf("success\n");
        set_opt(fd, 115200, 8, 'N', 1); 

    }


    ssize_t ret;
    char recvbuf[512];
    char *buf = "recv ok!";
    
    while(1)
    {
        memset(recvbuf, 0, sizeof(recvbuf));
        
        if((ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0)) == -1){
            return -1;
        }

        printf("recv :\r\n");
        printf("%s", recvbuf);
        printf("\r\n");

        write(fd, recvbuf, ret);
        
        if((ret = send(sockfd, buf, strlen(buf) + 1, 0)) == -1)
        {
            perror("send : ");
        }
        
    }
    

    close(sockfd);

    
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值