串口以及USB转串口收发程序(16进制数的读取发送)

该博客探讨了如何通过串口进行16进制数值的读取和发送,重点在于使用char类型的缓冲区处理数据,并且在读取时采用fscanf()函数配合%x格式说明符处理16进制数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中遇到一个问题,利用串口发送一串16进制数,每一个16进制数占8位,所以可以使用char类型buf数组来作为接发缓冲,注意点,读取时fscanf()中,类型使用“%x” 表示为一个16进制数。


#include<stdio.h>

#include<stdlib.h>  
#include<unistd.h>  
#include<sys/types.h>  
#include<sys/stat.h>  
#include<fcntl.h>  
#include<termios.h>  
#include<errno.h>  
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define FALSE -1  
#define TRUE 0  

/*

 * 串口配置   波特率,停止位,数据位,校验位

 */

int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300};  
long name_arr[] = {115200, 38400,  19200,  9600,  4800,  2400,  1200,  300};  
void set_speed(int fd, long speed)
{  
  int   i;   
  int   status;   
  struct termios   Opt;
  tcgetattr(fd, &Opt);
  bzero(&Opt,sizeof(struct termios)); //clear
  
  for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {   
    if  (speed == name_arr[i]) {       
      tcflush(fd, TCIOFLUSH);       
      cfsetispeed(&Opt, speed_arr[i]);    
      cfsetospeed(&Opt, speed_arr[i]);     
      status = tcsetattr(fd, TCSANOW, &Opt);    
      if  (status != 0) {          
        printf("tcsetattr fd\n");    
        return;       
      }      
      tcflush(fd,TCIOFLUSH);     
    }    
  }  
}  
  
int set_Parity(int fd,int databits,int stopbits,int parity)  
{   
    struct termios options;   
    if  ( tcgetattr( fd,&options)  !=  0) {   
        perror("SetupSerial 1");       
        return(FALSE);    
    }  
    options.c_cflag &= ~CSIZE;   
    switch (databits)   
    {     
    case 7:       
        options.c_cflag |= CS7;   
        break;  
    case 8:       
        options.c_cflag |= CS8;  
        break;     
    default:      
        fprintf(stderr,"Unsupported data size\n");
        return (FALSE);    
    }  
    switch (parity)   
    {     
        case 'n':  
        case 'N':       //无校验位
            options.c_cflag &= ~PARENB;   /* Clear parity enable */  
            options.c_iflag &= ~INPCK;     /* Enable parity checking */   
            break;   &nb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值