串口编程模板

该代码实现了一个函数PortSet,用于设置串口通信的波特率、数据位、停止位、校验方式等参数。另一个函数haeundaeControl通过指定USB设备名发送控制命令,并使用PortSet进行端口配置。主要涉及串口通信和设备控制操作。
摘要由CSDN通过智能技术生成
static int convbaud(unsigned long int baudrate)
{
    switch (baudrate)
    {
    case 2400:
        return B2400;
    case 4800:
        return B4800;
    case 9600:
        return B9600;
    case 19200:
        return B19200;
    case 38400:
        return B38400;
    case 57600:
        return B57600;
    case 115200:
        return B115200;
    default:
        return B9600;
    }
}

int PortSet(int fdcom, const pportinfo_t pportinfo)
{
    struct termios termios_old, termios_new;
    int            baudrate, tmp;
    char           databit, stopbit, parity, fctl;

    bzero(&termios_old, sizeof(termios_old));
    bzero(&termios_new, sizeof(termios_new));
    cfmakeraw(&termios_new);
    tcgetattr(fdcom, &termios_old);  // get the serial port attributions
    /*------------设置端口属性----------------*/
    // baudrates
    baudrate = convbaud(pportinfo->baudrate);
    cfsetispeed(&termios_new, baudrate);  //填入串口输入端的波特率
    cfsetospeed(&termios_new, baudrate);  //填入串口输出端的波特率
    termios_new.c_cflag |= CLOCAL;        //控制模式,保证程序不会成为端口的占有者
    termios_new.c_cflag |= CREAD;         //控制模式,使能端口读取输入的数据

    // 控制模式,flow control
    fctl = pportinfo->fctl;
    switch (fctl)
    {
    case '0':
    {
        termios_new.c_cflag &= ~CRTSCTS;  // no flow control
    }
    break;
    case '1':
    {
        termios_new.c_cflag |= CRTSCTS;  // hardware flow control
    }
    break;
    case '2':
    {
        termios_new.c_iflag |= IXON | IXOFF | IXANY;  // software flow control
    }
    break;
    }

    //控制模式,data bits
    termios_new.c_cflag &= ~CSIZE;  //控制模式,屏蔽字符大小位
    databit = pportinfo->databit;
    switch (databit)
    {
    case '5':
        termios_new.c_cflag |= CS5;
    case '6':
        termios_new.c_cflag |= CS6;
    case '7':
        termios_new.c_cflag |= CS7;
    default:
        termios_new.c_cflag |= CS8;
    }

    //控制模式 parity check
    parity = pportinfo->parity;
    switch (parity)
    {
    case '0':
    {
        termios_new.c_cflag &= ~PARENB;  // no parity check
    }
    break;
    case '1':
    {
        termios_new.c_cflag |= PARENB;  // odd check
        termios_new.c_cflag &= ~PARODD;
    }
    break;
    case '2':
    {
        termios_new.c_cflag |= PARENB;  // even check
        termios_new.c_cflag |= PARODD;
    }
    break;
    }

    //控制模式,stop bits
    stopbit = pportinfo->stopbit;
    if (stopbit == '2')
    {
        termios_new.c_cflag |= CSTOPB;  // 2 stop bits
    }
    else
    {
        termios_new.c_cflag &= ~CSTOPB;  // 1 stop bits
    }

    // other attributions default
    termios_new.c_oflag &= ~OPOST;  //输出模式,原始数据输出
    termios_new.c_cc[VMIN] = 1;     //控制字符, 所要读取字符的最小数量
    termios_new.c_cc[VTIME] = 1;    //控制字符, 读取第一个字符的等待时间    unit: (1/10)second

    tcflush(fdcom, TCIFLUSH);                       //溢出的数据可以接收,但不读
    tmp = tcsetattr(fdcom, TCSANOW, &termios_new);  //设置新属性,TCSANOW:所有改变立即生效    tcgetattr(fdcom, &termios_old);
    return (tmp);
}
int haeundaeControl(const char *usbName,const unchar *control_order, int order_len)
{
	printf("order = \n");
	for(int i=0;i<order_len;i++)
	{
		printf("%02x,",(unsigned char)control_order[i]);
	}
	printf("\n");
	struct timeval tv;
	unsigned char  status = 1;
    int            ufd = -3;
    int            ret = -1;
    portinfo_t portinfo = {
        '0',   // print prompt after receiving
        9600,  // baudrate: 9600
        '8',   // databit: 8
        '0',   // debug: off
        '0',   // echo: off
        '0',   // flow control: software
        '0',   // default tty: COM1
        '0',   // parity: none
        '1',   // stopbit: 1
        0      // reserved
    };
    	
    char rUsbName[24] = { 0 };
    sprintf(rUsbName, "/dev/%s", usbName);
    ufd = open(rUsbName, O_RDWR | O_NOCTTY);
    if (ufd < 0)
    {
        perror("open power tty");
        return -3;
    }
    PortSet(ufd, &portinfo);
    write(ufd,control_order,order_len);
    close(ufd);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值