Linux串口读写

Linux串口读取与解析 串口协议包的接收及解析处理 对于串口接收问题前面之前有文章介绍过串口缓存机制的应用。当然这里不应用缓存机制也是完全可行的。这里我们讲解基于不带串口缓存机制的处理。对于串口接收我们最常用的方式就是在串口中断中接收数据。 利用串口接收数据包信息大致分为下面三种情况: 接收一帧数据,对帧数据进行处理(可以利用串口接收非空中断和串口空闲中断实现) 中断中边接收边处理存储,并将有效数据存储起来,再对有效数据进行解析。 将接收到的数据全部存入缓存,从缓存中提取数据并做处理。 ... 阅读详情

Linux串口读写

串口简介

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIARS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4%的情况下,传输电缆长度应为50英尺。

Linux操作系统从一开始就对串行口提供了很好的支持

计算机串口的引脚说明

序号

信号名称

符号

流向

功能

2

发送数据

TXD

DTE→DCE

DTE发送串行数据

3

接收数据

RXD

DTE←DCE

DTE接收串行数据

4

请求发送

RTS

DTE→DCE

DTE请求DCE将线路切换到发送方式

5

允许发送

CTS

DTE←DCE

DCE告诉DTE线路已接通可以发送数据

6

数据设备准备好

DSR

DTE←DCE

DCE准备好

7

信号地

 

 

   信号公共地

8

载波检测

DCD

DTE←DCE

表示DCE接收到远程载波

20

数据终端准备好

DTR

DTE→DCE

DTE准备好

22

振铃指示

RI

DTE←DCE

表示DCE与线路接通,出现振铃

 

串口操作

串口操作需要的头文件

#include    <stdio.h>     /*标准输入输出定义*/

#include    <stdlib.h>    /*标准函数库定义*/

#include    <unistd.h>    /*Unix标准函数定义*/

#include    <sys/types.h> /*数据类型,比如一些XXX_t的那种*/

#include    <sys/stat.h>  /*定义了一些返回值的结构,没看明白*/

#include    <fcntl.h>     /*文件控制定义*/

#include    <termios.h>   /*PPSIX终端控制定义*/

#include    <errno.h>     /*错误号定义*/

 

打开串口

在Linux下串口文件是位于/dev下的

串口一为/dev/ttyS0

串口二为/dev/ttyS1

打开串口是通过使用标准的文件打开函数操作:

intfd;

/*以读写方式打开串口*/

fd= open("/dev/ttyS0",O_RDWR);

if(-1 == fd){

/*不能打开串口一*/

perror("提示错误!");

}

 

设置串口

最基本的设置串口包括波特率设置,效验位和停止位设置。

串口的设置主要是设置structtermios 结构体的各成员值。

structtermio

{  unsignedshort c_iflag;/*输入模式标志*/ 

   unsignedshort c_oflag;    /*输出模式标志*/ 

   unsignedshort c_cflag;    /*控制模式标志*/  

   unsignedshort c_lflag;    /*local mode flags */  

   unsignedchar  c_line;          /*line discipline */

   unsignedchar  c_cc[NCC];   /*control characters */

};

 

设置这个结构体很复杂,我这里就只说说常见的一些设置:

波特率设置

下面是修改波特率的代码:

struct termios Opt;

tcgetattr(fd,&Opt); /*获得当前设备模式,与终端相关的参数。fd=0标准输入*/

cfsetispeed(&Opt,B19200);/*设置结构termios输入波特率为19200Bps*/

cfsetospeed(&Opt,B19200);  /*fd应该是文件描述的意思*/

tcsetattr(fd,TCANOW,&Opt);/*设置终端参数,TCANOW修改立即发生*/

 

设置波特率的例子函数:

/**

*@brief 设置串口通信速率

*@param fd     类型int 打开串口的文件句柄

*@param speed  类型int 串口速度

*@return void

*/

intspeed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,

                 B38400, B19200,B9600, B4800, B2400, B1200, B300, };

intname_arr[] = {38400,  19200,  9600,  4800, 2400,  1200,  300, 38400, 

                 19200, 9600, 4800, 2400, 1200,  300, };

voidset_speed(intfd, intspeed){

   int  i;

   int  status;

   structtermios   Opt;

   tcgetattr(fd,&Opt);

   for( i= 0;  i < sizeof(speed_arr)/ sizeof(int); i++) {

      if (speed == name_arr[i]) {

/**

 *tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。queue参数应是下列三个常数之一:

*TCIFLUSH刷清输入队列。

 *TCOFLUSH刷清输出队列。

*TCIOFLUSH刷清输入、输出队列。

 */

   tcflush(fd,TCIOFLUSH);//设置前flush    

   cfsetispeed(&Opt,speed_arr[i]); 

  cfsetospeed(&Opt,speed_arr[i]);  

   //通过tcsetattr函数把新的属性设置到串口上。

   //tcsetattr(串口描述符,立即使用或者其他标示,指向termios的指针)

   status= tcsetattr(fd, TCSANOW, &Opt); 

   if (status != 0)

{       

      perror("tcsetattrfd1"); 

      return;    

    }   

    tcflush(fd,TCIOFLUSH); //设置后flush

  } 

}

}

 

效验位和停止位的设置:

无效验

8位

Option.c_cflag&= ~PARENB;
Option.c_cflag&= ~CSTOPB;
Option.c_cflag&= ~CSIZE;
Option.c_cflag|= ~CS8;

奇效验(Odd)

7位

Option.c_cflag|= ~PARENB;
Option.c_cflag&= ~PARODD;
Option.c_cflag&= ~CSTOPB;
Option.c_cflag&= ~CSIZE;
Option.c_cflag|= ~CS7;

偶效验(Even)

7位

Option.c_cflag&= ~PARENB;
Option.c_cflag|= ~PARODD;
Option.c_cflag&= ~CSTOPB;
Option.c_cflag&= ~CSIZE;
Option.c_cflag|= ~CS7;

Space效验

7位

Option.c_cflag&= ~PARENB;
Option.c_cflag&= ~CSTOPB;
Option.c_cflag&= &~CSIZE;
Option.c_cflag|= CS8;

设置效验的函数:

/**

 *@brief  设置串口数据位,停止位和效验位

 *@param fd     类型 int 打开的串口文件句柄

 *@param databits 类型 int数据位  取值为7或者8

 *@param stopbits 类型 int停止位  取值为1或者2

 *@param parity  类型 int 效验类型取值为N,E,O,,S

 */

intset_Parity(intfd, intdatabits, intstopbits, intparity)

{

   structtermios options;

   if(tcgetattr(fd, &options) != 0)

   {

      perror("SetupSerial1");

      return(FALSE);

   }

   options.c_cflag&= ~CSIZE;

   switch(databits)

   /*设置数据位数*/

   {

   case7:

      options.c_cflag|= CS7;

      break;

   case8:

      options.c_cflag|= CS8;

      break;

   default:

      fprintf(stderr,"Unsupporteddata 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;

   case'o':

   case'O':

      options.c_cflag|= (PARODD | PARENB); /*设置为奇效验*/

      options.c_iflag|= INPCK; /*Disnable parity checking */

      break;

   case'e':

   case'E':

      options.c_cflag|= PARENB; /*Enable parity */

      options.c_cflag&= ~PARODD; /*转换为偶效验*/

      options.c_iflag|= INPCK; /*Disnable parity checking */

      break;

   case'S':

   case's':/*asno parity*/

      options.c_cflag&= ~PARENB;

      options.c_cflag&= ~CSTOPB;

      break;

   default:

      fprintf(stderr,"Unsupportedparity\n");

      return(FALSE);

   }

   /*设置停止位*/

   switch(stopbits)

   {

   case1:

      options.c_cflag&= ~CSTOPB;

      break;

   case2:

      options.c_cflag|= CSTOPB;

      break;

   default:

      fprintf(stderr,"Unsupportedstop bits\n");

      return(FALSE);

   }

   /*Set input parity option */

   if(parity != 'n')

      options.c_iflag|= INPCK;

   tcflush(fd,TCIFLUSH);

   options.c_cc[VTIME]= 150; /*设置超时15seconds*/

   options.c_cc[VMIN]= 0; /*Update the options and do it NOW */

   if(tcsetattr(fd, TCSANOW, &options) != 0)

   {

      perror("SetupSerial3");

      return(FALSE);

   }

   return(TRUE);

}

 

需要注意的是:

如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(RawMode)方式来通讯,设置方式如下:

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/

options.c_oflag &= ~OPOST;   /*Output*/

 

读写串口

设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。

  • 发送数据

char buffer[1024];

int   Length;

int   nByte;

nByte= write(fd, buffer ,Length)

 

  • 读取串口数据

使用文件操作read函数读取,如果设置为原始模式(RawMode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。

可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。

char buff[1024];

int   Len;

int readByte = read(fd,buff,Len);

 

关闭串口

关闭串口就是关闭文件。

close(fd);

 



下面是一个简单的读取串口数据的例子,使用了上面定义的一些函数和头文件

/**********************************************************************

 *代码说明:使用串口二测试的,发送的数据是字符,但是没有发送字符串结束符号,

 *所以接收到后,后面加上了结束符号。我测试使用的是单片机发送数据到第二个串口,测试通过。

 **********************************************************************/

#defineFALSE  -1

#defineTRUE   0

/*********************************************************************/

intOpenDev(char*Dev)

{

   //Dev就是设备,设备就是文件,就是给出该设备文件的路径

   intfd = open(Dev,O_RDWR ); //|O_NOCTTY | O_NDELAY

   if(-1 == fd)

   {

      perror("Can'tOpen Serial Port");

      return-1;

   }

   else

      returnfd;

}

intmain(intargc, char**argv)

{

   intfd;

   intnread;

   charbuff[512];

   char*dev = "/dev/ttyS1";//串口二

   fd = OpenDev(dev);

   set_speed(fd, 19200);

   if(set_Parity(fd, 8, 1, 'N')== FALSE)

   {

      printf("SetParity Error\n");

      exit(0);

   }

   while(1) //循环读取数据

   {

      while((nread = read(fd,buff, 512))>0)

      {

          printf("\nLen%d\n",nread);

          buff[nread+1]= '\0';

          printf("\n%s",buff);

      }

   }

   //close(fd); 

   //exit (0);



1
、虚拟机下使用串口的方法
使用vmwave,默认串口设备是没有添加的,通过vmwave将设备加入即可正常使用串口。虚拟机串口打开后,可能会占用windows下的串口。另外,虚拟机的串口收发比正常的速度的确要慢许多。



2
、消除Linux串口收发的一些规则

Linux
串口收发有许多模式,如:

(1)接收返回模式: 如果串口没有接收到数据,read()函数不返回。

(2)数据接收\n才返回接收的数据,否则read()函数返回0

(3)特殊字符解析问题,部分特殊字符接收/发送时,会被屏蔽或者转义。如发送0x0A接收变为0x0A0x0A ,0x0D被屏蔽等。

(4)接收反馈:如串口接收到数据,立即将该数据发送出去。

(上面是我遇到的一些问题,可能表述不很清楚,呵呵。如果用于收发txt文件,一般不大注意。)



3
、解决问题的方法是,消除这些默认规则,关键是structtermios 的参数影响。

structtermios  {

tcflag_t c_iflag;              /**//*
输入模式旗标*/

tcflag_tc_oflag;              /**//*
输出模式旗标*/

tcflag_tc_cflag;              /**//*
控制模式旗标*/

tcflag_tc_lflag;              /**//*
区域模式旗标 */

cc_tc_line;                   /**//*
行控制 (linediscipline) */

cc_t c_cc[NCCS];          /**//*
控制特性*/

};





由于研究不深,如果要消除所有上面的规则,我是如下处理的

structtermios options;

串口打开方式:

open("dev/ttyS0" , O_RDWR|O_NOCTTY| O_NDELAY);

消除收发模式规则:

options.c_lflag       = 0;

options.c_oflag       = 0;

options.c_iflag       = 0;



消除字符屏蔽规则:

options.c_cc[VINTR]   = 0;       /**//* Ctrl-c*/

options.c_cc[VQUIT]     = 0;  /**//* Ctrl- */

options.c_cc[VERASE]    = 0;  /**//* del */

options.c_cc[VKILL]    = 0;  /**//* @ */

options.c_cc[VEOF]     = 0;  /**//* Ctrl-d */

options.c_cc[VTIME]    = 1;  /**//*  */

options.c_cc[VMIN]     =0;   /**//*  */

options.c_cc[VSWTC]   = 0;   /**//* '' */

options.c_cc[VSTART]  = 0;   /**//* Ctrl-q */

options.c_cc[VSTOP]   = 0;   /**//* Ctrl-s */

options.c_cc[VSUSP]   = 0;   /**//* Ctrl-z */

options.c_cc[VEOL]    = 0;   /**//* '' */

options.c_cc[VREPRINT] = 0;  /**//* Ctrl-r */

options.c_cc[VDISCARD] = 0;  /**//* Ctrl-u */

options.c_cc[VWERASE]  = 0;  /**//* Ctrl-w */

options.c_cc[VLNEXT]   = 0;  /**//* Ctrl-v */

options.c_cc[VEOL2]    = 0;  /**//* ''*/



以上设置,在其它参数串口设置前执行,如果你需要保留部分参数,请参阅http://blog.chinaunix.net/article.php?articleId=15964&blogId=60

在RedHatFeroda 4 下编译通过



== = = = = = = = = =
非阻塞read== = = = = = = = = =

Q
:在调用串口read(fd,  buff,  len);时,如果串口没有数据,会停在read处,请问有没有办法让这个read动作中止?

A
:使用非阻塞方式select函数(I/O多工机制)或者open的时候加O_NONBLOCK参数。

intselect(int n,fd_set * readfds,fd_set * writefds,fd_set *exceptfds,struct timeval * timeout);
关于这个函数的使用我会在下篇blog中整理。

== = = = = = = = = =
串口收发源码== = = = = = = = = =

一下代码已经经过我测试,没有问题。开发环境Redhat9,运行环境s3c2410

== = = = = receive.c= = = = = =

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


#define TRUE 1

//
初始化串口选项: 

voidsetTermios(struct termios * pNewtio, intuBaudRate)
{
bzero(pNewtio, sizeof(struct termios)); /*clear struct for new port settings */
//8N1
pNewtio->c_cflag= uBaudRate | CS8 | CREAD | CLOCAL;
pNewtio->c_iflag =IGNPAR;
pNewtio->c_oflag = 0;
pNewtio->c_lflag = 0;//non ICANON

/*

initialize all controlcharacters

default values can be found in/usr/include/termios.h, and

are given in the comments, butwe don't need them here

*/

pNewtio->c_cc[VINTR] =0; /* Ctrl-c */
pNewtio->c_cc[VQUIT] = 0; /* Ctrl-\*/
pNewtio->c_cc[VERASE] = 0; /* del */
pNewtio->c_cc[VKILL]= 0; /* @ */
pNewtio->c_cc[VEOF] = 4; /* Ctrl-d*/
pNewtio->c_cc[VTIME] = 5; /* inter-character timer,timeout VTIME*0.1 */
pNewtio->c_cc[VMIN] = 0; /* blockingread until VMIN character arrives */
pNewtio->c_cc[VSWTC] =0; /* '\0' */
pNewtio->c_cc[VSTART] = 0; /* Ctrl-q*/
pNewtio->c_cc[VSTOP] = 0; /* Ctrl-s*/
pNewtio->c_cc[VSUSP] = 0; /* Ctrl-z*/
pNewtio->c_cc[VEOL] = 0; /* '\0'*/
pNewtio->c_cc[VREPRINT] = 0; /* Ctrl-r*/
pNewtio->c_cc[VDISCARD] = 0; /* Ctrl-u*/
pNewtio->c_cc[VWERASE] = 0; /* Ctrl-w*/
pNewtio->c_cc[VLNEXT] = 0; /* Ctrl-v*/
pNewtio->c_cc[VEOL2] = 0; /* '\0' */
}



#defineBUFSIZE 512

int main(int argc, char **argv)
{
intfd;
int nread;
char buff[BUFSIZE];
struct termios oldtio,newtio;
struct timeval tv;
char *dev ="/dev/ttyS0";
fd_setrfds;
if ((fd = open(dev, O_RDWR | O_NOCTTY))<0)
{
printf("err:can't open serial port!\n");
return -1;
}
tcgetattr(fd,&oldtio); /* save current serial port settings*/
setTermios(&newtio, B115200);
tcflush(fd,TCIFLUSH);
tcsetattr(fd, TCSANOW,&newtio);

tv.tv_sec=30;
tv.tv_usec=0;
while(TRUE)
{
printf("wait...\n");
FD_ZERO(&rfds);
FD_SET(fd,&rfds);
if (select(1+fd, &rfds, NULL, NULL,&tv)>0)
{
printf("wait...\n");
if(FD_ISSET(fd, &rfds))
{
nread=read(fd, buff,BUFSIZE);
printf("readlength=%d\n",nread);
buff[nread]='\0';
printf("%s\n",buff);
}
}
}
tcsetattr(fd, TCSANOW,&oldtio);
close(fd);
}


== = = = send.c= = = = = =

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



//
初始化串口选项: 
voidsetTermios(struct termios * pNewtio, intuBaudRate)
{
bzero(pNewtio, sizeof(struct termios)); /*clear struct for new port settings */
//8N1
pNewtio->c_cflag= uBaudRate | CS8 | CREAD | CLOCAL;
pNewtio->c_iflag =IGNPAR;
pNewtio->c_oflag = 0;
pNewtio->c_lflag = 0;//non ICANON

/*

initialize all controlcharacters

default values can be found in/usr/include/termios.h, and

are given in the comments, butwe don't need them here

*/

pNewtio->c_cc[VINTR] =0; /* Ctrl-c */
pNewtio->c_cc[VQUIT] = 0; /* Ctrl-\*/
pNewtio->c_cc[VERASE] = 0; /* del */
pNewtio->c_cc[VKILL]= 0; /* @ */
pNewtio->c_cc[VEOF] = 4; /* Ctrl-d*/
pNewtio->c_cc[VTIME] = 5; /* inter-character timer,timeout VTIME*0.1 */
pNewtio->c_cc[VMIN] = 0; /* blockingread until VMIN character arrives */
pNewtio->c_cc[VSWTC] =0; /* '\0' */
pNewtio->c_cc[VSTART] = 0; /* Ctrl-q*/
pNewtio->c_cc[VSTOP] = 0; /* Ctrl-s*/
pNewtio->c_cc[VSUSP] = 0; /* Ctrl-z*/
pNewtio->c_cc[VEOL] = 0; /* '\0'*/
pNewtio->c_cc[VREPRINT] = 0; /* Ctrl-r*/
pNewtio->c_cc[VDISCARD] = 0; /* Ctrl-u*/
pNewtio->c_cc[VWERASE] = 0; /* Ctrl-w*/
pNewtio->c_cc[VLNEXT] = 0; /* Ctrl-v*/
pNewtio->c_cc[VEOL2] = 0; /* '\0' */
}



intmain(int argc, char **argv)
{
int fd;
int nCount, nTotal,i;
struct termios oldtio, newtio;
char *dev="/dev/ttyS0";
if ((argc!=3) || (sscanf(argv[1],"%d", &nTotal) != 1))
{
printf("err: needtow arg =%d!\n", argc );
return -1;
}

if ((fd =open(dev, O_RDWR | O_NOCTTY))<0)
{
printf("err:can't open serial port!\n");
return -1;
}

tcgetattr(fd,&oldtio); /* save current serial port settings*/
setTermios(&newtio, B115200);
tcflush(fd,TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
for (i=0;i<nTotal; i++)
{
nCount=write(fd, argv[2],strlen(argv[2]));
printf("senddata\n");
sleep(1);
}
tcsetattr(fd, TCSANOW,&oldtio);
close(fd);
return 0;
}






== = = = =.makefile= = = = = =



CC =gcc

all:receive send

receive: receive.c

$(CC)receive.c -o  receive

send: send.c

$(CC) send.c-o  send

clean:

-rm -rf testCOM receive send


Linux下串口通信详解(下)读写串口及关闭串口 上一篇博客是串口的打开及配置,博客链接http://blog.youkuaiyun.com/specialshoot/article/details/50707965 这一篇我将要把读写串口及串口关闭的操作详细介绍一下。 读串口 读串口就是接收串口数据,通过read来实现。 read函数原型: #include ssize_t read(int fd, void *buf, size_t 阅读详情

相关推荐

Linux 串口读取

#include <stdlib.h> #include <fcntl.h> #include "stdio.h" #include "termios.h" #include "unistd.h" #include "limits.h" #include <stdint.h> #include "time.h" //=================== #include <sys/select.h> #include <sys/tim.

wabil的专栏 6440

Linux的串口读写详解

文章目录一、前言二、运行环境三、串口相关的数据结构和函数1、需要配置的结构体2、系统相关函数三、串口属性的配置1、波特率配置2、 一、前言 本文为《搭建物联网基础通信框架系列教程》的分支部分,读写Linux的串口数据。 二、运行环境 Ubuntu16.04 三、串口相关的数据结构和函数 1、需要配置的结构体 struct termios { tcflag_t c_iflag; /* ...

qq_41911313的博客 2957

Linux下读写UART串口的代码

Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比较的复杂,就直接跳过了,好在代码能用,记录一下~ 两个有用的函数~ //////////////////////////////////////////////////////////////////////////////// /** *@brief 设置串口通信速率 *@param fd

Yao.GUET 3万+

Linux C/C++串口读写

无

AAA375的博客 1万+

linux ttyusb读写_LINUX下USB转串口编程中的一点心得

串口设备的名字普通物理串口是ttySx,比如ttyS0, ttyS1等,USB转串口的设备名为ttyUSBx,比如ttyUSB0, ttyUSB1等设置读写RAW模式这一步非常重要,不设置就收不到数据,一个字节都没有,下面是设置RAW模式的代码int SetRawMode(int fd){struct termios opt;opt.c_iflag &= ~(IGNBRK|BRKINT|P...

weixin_42398141的博客 2069

Linux——Linux系统编程之串口编程总结(串口的初始化、读写操作实践)

0 引言 串口大家一定不会陌生了(如果需要进一步了解的话可以看下这篇博文),开发中对我们调试非常重要,在单片机中,我们可以直接对寄存器和串口中断直接操作。在Linux串口编程中,串口的驱动一般是不用我们自己去写的,对应的硬件原厂或者原生态Linux内核已经带有串口驱动了,我们直接用就可以,既然是用,抓住两个重点就行:如何初始化串口、如何读写。 1 串口编程的流程 ...

数字世界 万物互联 1543

LINUX 简单的串口读写实例

 #include           /*标准输入输出定义*/#include          /*标准函数库定义*/#include          /*Unix 标准函数定义*/#include       #include        #include     "string.h"#include           /*文件控制定义*/#incl

mochouxiyan的专栏 1万+

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 605

[Linux] 串口读写

可以使用cat来读取串口中的数据,如cat /dev/ttyS3,注意 在这里使用cat的时候串口会回显输入的数据,例如我在这里串口输入 123 ,注意点发送新行。也可以读取数据并保存到txt文本文件中,如cat /dev/ttyS3 > test.txt,这里不演示。读取函数为 read(fd,&readbuf,sizeof(readbuf));设置串口的属性为115200,校验位等都是通过这个命令设置。可以直接操作串口1/3,在这里使用串口3。通过串口输入内容会通过串口返回。ls 查看当前文件夹文件。

技术的力量能够改变世界 2610

【深度解析】AURIX TC387 UCB Flash架构与避坑指南(第一篇)

摘要:UCB(用户配置块)是AURIX TC3xx芯片启动与安全的关键配置区域,位于DFLASH0存储区。每个512字节的UCB包含启动模式、安全设置等关键参数,并通过强制CRC32校验确保完整性。UCB分为启动头(UCB_BMHD)、安全配置(UCB_ORIG)及其备份(UCB_COPY)三种主要类型。不同于常规Flash,UCB具有自动擦除特性,错误配置可能导致芯片永久锁死。开发中应谨慎修改UCB,必须同时编程原始和备份版本,并确保正确的CRC校验。后续文章将详细介绍UCB编程方法和调试技巧。

2511_94612429的博客 1234

D类功放几种常见“爆破音”问题根源与改善措施

在数字D类功放刚上电或功放播放状态切换时,人耳偶尔会听到“嘣”的声音,我们把这个爆破的Pop Noise。数字功放Pop Noise 出现的原因有很多,本文主要分析Pop Noise 出现原因,并提供相应解决方法。

qq_26815321的博客 3591

linux串口读写的c程序1,Linux C Serial串口编程

1,Linux 下打开串口设备,信号模型 读写程序2,串口读写的IO复用Select模型3, Linux 下打开串口设备,读写程序1,Linux 下打开串口设备,信号模型 读写程序root@linux:/tmp/serial#catmain.c#include#include#include#include#include#include#include#include#include#def...

weixin_32848231的博客 953

OMI数据获取与可视化:从下载到大气污染分析

本文详细介绍了如何获取与处理OMI卫星数据,以进行大气污染分析。内容涵盖从NASA GES DISC官方源下载对流层NO2数据、使用MATLAB或Python进行月均数据处理与网格化,到利用m_map或cartopy工具进行专业可视化的完整流程。重点解析了数据下载技巧、NetCDF格式处理、地图投影与填色方法,并探讨了时间序列分析与动态可视化等深度应用,为环境研究者提供了一套从数据到洞察的实用指南。

weixin_29210759的博客 269

linux 多进程用串口,LINUX多线程读写串口实例

LINUX环境下,使用多线程读写串口:普通串口 MODEMDEVICE "/dev/ttyS0"USB转串口MODEMDEVICE "/dev/ttyUSB0"获取串口控制权限, sudo chmod 666 /dev/ttyUSB0使用特殊设定,实现任意自定义波特率,例如B256000 B460800等等。// 设置为特殊波特率,比如200000, 这个设置方法在虚拟机环境下不能通过,需要在真正...

weixin_39830313的博客 1276

超详细版!Obsidian+Claude+Skills+云同步,打造智能 AI 知识库

本文介绍如何搭建高效的AI知识管理系统,将Obsidian笔记工具与ClaudeAI助手深度整合。通过ClaudeCode安装配置、ObsidianSkills插件添加和坚果云同步设置,实现本地存储安全性与云端便捷性的完美结合。该系统支持智能笔记整理、知识图谱可视化、智能搜索问答和内容创作辅助等功能,使静态笔记转变为能自动分析关联、处理复杂结构的"活"知识库。详细步骤包括工具准备、环境配置、插件安装和云同步设置

2301_79998006的博客 1080

沉降预测算法-指数曲线法

沉降预测的指数曲线法原理和代码实现

yh523的博客 1010

linux系统实现串口,Linux下实现串口读写操作

Linux下实现串口读写操作这里只贴串口读写操作部分代码,供大家参考学习用,该部分代码主要实现打开串口,配置串口参数波特率为115200、停止位1、数据位8、无校验位,发送2个数据,等待接收24个数据。代码是在QT窗体程序里实现,界面添加了了一个按钮,3个文本框,按下去发送2个数据,等待接收到24个数据后,把发送数据长度、接收数据长度、串口句柄在文本框显示出来。#include "mainwind...

weixin_39954569的博客 1646

华为的LTC(Lead to Cash,从线索到现金)流程是其销售管理体系的核心,覆盖了从发现销售线索到最终收回现金的全过程,强调端到端的业务贯通和以客户为中心的运营理念

华为LTC流程是覆盖销售全周期的管理体系,包含四大阶段:线索转机会(LTO)、机会转订单(OTO)、订单转交付(OTD)、交付转现金(DTC)。其核心采用"铁三角"团队模式(AR/SR/FR协作),通过多部门联合评审把控关键节点,实现端到端业务贯通。该流程与IPD、MTL、ITR等体系高效协同,结合iSales平台实现数字化管理,有效提升销售效率、客户满意度和资金回笼速度。

金牌架构师 1721

Linux 串口读写

串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIARS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采...

dingxiu8587的博客 405

多源异构数据融合(Kaggle+Google Trends联合分析)

本文详细介绍了如何利用Python实现多源异构数据融合,以Kaggle电商销售数据与Google Trends搜索指数为例,展示了数据清洗、预处理、时间对齐、数据合并、相关性分析、回归建模和可视化全过程。数据预处理与内存优化通过分块加载、数据类型转换和缺失值处理,有效降低了大规模数据在内存中的占用,并确保数据质量。时间对齐与数据融合策略采用重采样与内连接方法对齐不同数据源的时间维度,实现了高质量数据的融合,为后续联合分析奠定基础。模型构建与分析。

闲人编程的博客 1016

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux下Java使用RXTX串口读写

  公司安排我做Linux下Java串口读写,折腾两天,终于有一个完美的解决方案,记录并分享,减少弯路。     RXTX串口读写在windows下开发正常,在Linux下存在bug,主要表现为:在代码中能正常开启串口后,发数据时oStream.flush()方法报错,收数据时iStream.read()方法jvm崩溃报错,报错信息是Java_gnu_io_RXTXPort_nativeDrain。     从RXTX官网下载的rxtx 2.1-7源代码可在Linux上编译,编译后使用会导致jvm崩溃(

digitalscience的博客 3448

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

linux c 读取串口,linux_c_c++串口读写串口读写.doc

linux_c_c++串口读写串口读写.doc还剩17页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧,价低环保!内容要点:tcsetattr(fd, TCSANOW, &oldtio);close(fd);return 0;}= = = = = =.makefile= = = = = =CC = gccall:receive sendreceive: receive.c...

weixin_42308943的博客 383

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux实现串口读取c程序,C++实现Linux下串口的读写

作为一个嵌入式程序员,串口的读写已经见怪不怪了。嵌入式Linux的串口也应用广泛。百度一搜也有许多讲解这方面的知识,今天我只展示我Linux下用C++实现的一个串口类可以实现类似于单片机中断的机制。使用起来很方便我只展示接口:/** File: BSerialPort.h*/#ifndef BSERIALPORT_H#define BSERIALPORT_Hclass BSerialPort ...

weixin_39785400的博客 828
上一篇: linux下ip命令使用
下一篇: Linux用户进程内存泄露一种检测方法
legendmaker
博客等级 码龄18年 9粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值