串口数据传输过快时,接收数据出现“卡顿”情况,有遇到过类似情况麻烦给下建议

逻辑运算符 2019-09-11 05:28:40
现象:
1.主机是嵌入式平台,当外部串口指令以10fps,每帧数据10个字节以内发送时,主机串口接收正常。
2.当指令发送速度提高时(大概有100fps),会出现接收卡顿的情况,即有几秒读到空白数据,然后一次性读到缓存区积累的数据。
3.该现象发生在波特率设置小于等于19200时出现,通讯波特率设置到115200后该现象消失。
4.用电脑串口工具接收外部串口是正常的,并未出现该现象。

在外部串口波特率(19200)无法改变的情况下,怎么配置串口参数去除该现象?
...全文
4032 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_67361791 2022-02-25
  • 打赏
  • 举报
回复
楼主,这个问题你怎么解决的,我现在遇到相同的问题了,一个礼拜了,没有找到方法解决
hhhh63 2019-09-14
  • 打赏
  • 举报
回复
还有,设置优化编译参数也能加快
hhhh63 2019-09-14
  • 打赏
  • 举报
回复
接收程序耗时太多,优化代码,用DMA,加异常处理。
hjhj7591418 2019-09-12
  • 打赏
  • 举报
回复
使用串口的DMA接收,在主循环或者定时任务里进行串口接收DMA数据的处理。
逻辑运算符 2019-09-11
  • 打赏
  • 举报
回复
接收端基于Linux开发
配置接口代码如下
static int uart_setup( int fd, int baudrate, int flow_ctrl, int databits, int parity, int stopbits )
{
//串口主要设置结构体termios <termios.h>
struct termios options;
int baud_val;

/**1. tcgetattr函数用于获取与终端相关的参数。
*参数fd为终端的文件描述符,返回的结果保存在termios结构体中 */
tcgetattr( fd, &options );
/**2. 修改所获得的参数*/

//设置串口输入波特率和输出波特率
switch( baudrate )
{
case 115200:
baud_val = B115200;
break;
case 57600:
baud_val = B57600;
break;
case 38400:
baud_val = B38400;
break;
case 19200:
baud_val = B19200;
break;
case 9600:
baud_val = B9600;
break;
case 4800:
baud_val = B4800;
break;
case 2400:
baud_val = B2400;
break;
case 1200:
baud_val = B1200;
break;
case 300:
baud_val = B300;
break;
default :
printf("Unsupported baudrate\n");
return (-1);
}
cfsetispeed( &options, baud_val );
cfsetospeed( &options, baud_val );

options.c_cflag |= ( CLOCAL | CREAD );//设置控制模式状态,本地连接,接收使能
//设置数据流控制
switch( flow_ctrl )
{
case 0 ://不使用流控制
options.c_cflag &= ~CRTSCTS;
break;
case 1 ://使用硬件流控制
options.c_cflag |= CRTSCTS;
break;
case 2 ://使用软件流控制
options.c_cflag |= IXON | IXOFF | IXANY;
break;
default :
printf("Unsupported flow control\n");
return (-1);
}
//设置数据位
options.c_cflag &= ~CSIZE;//字符长度,屏蔽其他标志位,设置数据位之前一定要屏掉这个位
switch ( databits )
{
case 5 :
options.c_cflag |= CS5;
break;
case 6 :
options.c_cflag |= CS6;
break;
case 7 :
options.c_cflag |= CS7;
break;
case 8 :
options.c_cflag |= CS8;
break;
default :
printf("Unsupported data size\n");
return (-1);
}

//设置校验位
switch ( parity )
{
case 'n':
case 'N': //无奇偶校验位。
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
break;
case 'o':
case 'O'://设置为奇校验
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK;
break;
case 'e':
case 'E'://设置为偶校验
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK;
break;
case 's':
case 'S': //设置为空格
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
printf("Unsupported parity\n");
return (-1);
}
// 设置停止位
switch ( stopbits )
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
printf("Unsupported stop bits\n");
return (-1);
}

options.c_cc[VMIN] = 1;
options.c_cc[VTIME] = 0;
options.c_oflag = 0;
options.c_lflag = 0;
options.c_iflag &= ~(ICRNL | IXON);

//修改输出模式,原始数据输出
options.c_oflag &= ~OPOST;

/**3. 设置新属性,TCSANOW:所有改变立即生效*/
tcflush( fd, TCIFLUSH );//溢出数据可以接收,但不读
tcsetattr( fd, TCSANOW, &options );

return 0;
}

串口接收接口代码如下
static int uart_recv( int fd, char *data, int datalen )
{
int len = 0, ret = 0;
fd_set fs_read; /* 先声明一个 fd_set 集合来保存我们要检测的 fd句柄 */
struct timeval tv_timeout;

FD_ZERO( &fs_read ); /* 用select函数之前先把集合清零 */
FD_SET( fd, &fs_read ); /* 把要检测的句柄fd加入到集合里 */
tv_timeout.tv_sec = 0;//( 10*20/115200 + 2 ); /*设置等待最长时间*/
tv_timeout.tv_usec = 16000;

ret = select( fd+1, &fs_read, NULL, NULL, &tv_timeout ); /* 检测我们上面设置到集合fs_read里的句柄是否有可读信息 */
//printf("ret = %d\n", ret);

if( ret < 0 )
{
perror("select");/* 这说明select函数出错 */
return -1;
}
else
{ /* 说明等待时间还未到设定时间,fd的状态发生了变化 */
/* ret这个返回值记录了发生状态变化的句柄的数目,由于我们只监视了fd这一个句柄,所以这里一定ret=1,如果同时有多个句柄发生变化返回的就是句柄的总和了 */
/* 这里我们就应该从fd这个句柄里读取数据了,因为select函数已经告诉我们这个句柄里有数据可读 */
if ( FD_ISSET( fd, &fs_read ) ) /* 先判断一下socket这外被监视的句柄是否真的变成可读的了 */
{
len = read( fd, data, datalen ); /* 读取fd句柄里的数据 */
//printf("len = %d\n", len);
return len;
}
}
return 0;
}
关于手机的一些基础知 手机工作原理介绍的一编文章(续四) 手机所有软件工作的流程都是在CPU的作用下进行的,具体的划分包括下文所述的5个流程。这些流程都是以软件数据的形式储于手机的EEPROM和FLASHROM中. 一、开机流程 当手机的供电模块检测到电源开关键被按下后,会将手机电池的电压转换为适合手机电路各部分使用的电压值,供应给相应的电源模块,当钟电路得到供电电压后产生震荡信号,送入逻辑电路,CPU在得到电压和钟信号后会执行开机程序,首先从ROM中读出引导码,执行逻辑系统的自检。并且使所有的复位信号置高,如果自检通过,则CPU给出看门狗(Watchdog)信号给各模块,然后电源模块在看门狗(Watchdog)信号的作用下,维持开机状态。 二、上网流程 手机开机后,既搜索广播控制信号道(BCCH)的载频。因为系统随都向在小区中的各用户发送出用户广播控制信息。手机收集搜索到最强的(BCCH)的载频。对应的载频频率后,读取频率校正信道(FCCH),使手机(MS)的频率与同步。所以每一个用户的手机在不同上午位置(既不同的小区)的载频是固定的,它是由GSM网络运营商组网确定,而不是由用户的GSM手机来决定。手机读取同步信道(SCH)的信息后找出基地站(BTS)的任别码,并同步到超高帖TDMA的帖号上。手机在处理呼叫前读取系统的信息。比如:邻近小区的情况、现在所处小区的使用频率及小区是否可以使用移动系统的国家号码和网络号码等等,这些信息都可以在以BCCH上得到手机在请求接入信道(RACH)上发出接入请求信息,向系统送SIM卡帐号等信息。系统在鉴权合格后,通过允许接入信道(AGCH)使GSM手机接入信道上并分 配到GSM手机一个独立专用控制信道(SDCCH)。手机在SDDCCH上完成登记。在满速随路控制信道(SACCH)上发出控制指令,然后手机返回空闲状态,并监听BCCH和CCCH共控制信道上的信息。此手机已经做好了寻呼的准备工作。 一、 机流程 用户监测BCCH,必须与相近的基站取得同步。通过接收FCCH、SCH 、BCCH信息,用户将被锁定到系统及适应的BCCH上。 二、 呼叫流程 1、手机作主叫 我们GSM系统中由手机发出呼叫的情况,首先,用户在监测BCCH,必须与相近的基站取得同步。通过接收FCCH、SCH、BCCH信息,用户将被锁定到系统及适当的BCCH上的。为了发出呼叫,用户首先要拨号,并按压GSM手机的发射键。手机用锁定它的基站系统的ARFCN来发射RACH数据突发序列。然后基站以CCCH上的AGCH信息来响应,CCCH为手机指定一个新的信道进行SDSSH连接。正在监测BCCH中T的用户,将从AGCH接收到它的ARFCN和TS安排,并立即转到新的ARFCN和TS上,这一新的ARFCN和TS分配就是SDCH(不是TCH)。一旦转接到SDCCH,用户首先等待传给它的SCCH(等待最大持续26或120ms)这信息告知手机要求的定提前量和发射功率。基站根据手机以前的RACH传输数据能够决定出适合的定提前量和功率级,并且通过SACCH发送适当的数据供手机处理。在接收和处理完SACCH中的定提前量信息后,用户能够发送正常的、话音业务所要的求的是突发序列消息。当PSTN从拨号端连接到MSC,且MSC将话音路径接入服务基站,SDCCH检查用户的合法及有效性,随后在手机和基站之间发送信息。几秒钟后,基站经由SDSSH告知手机重新转向一个为TCH安排的ARFCN和TS。一旦再次接到TCH,语音信号就在前向链路上传送,呼叫成功建立,SDCCH被腾空。 2、手机作被叫 当从PSTN发出呼叫,其过程与上述过程类似。基站在BCCH适应内的Tso期间,广播一个PCH消息。锁定于相同ARFCN上的手机检测对它的寻呼,并回复 一个RACH消息,以确认接收到寻呼。当网络和服务器基站连接后,基站采用CCCH上的AGCH将手机分配到一个新的物理信道,以便连接SDCCH和 SACCH。一旦用户在SDCCH上建立了定提前量并获准确认后,基站就在SDCCH上面重新分配物理信道,同也确立了TCH的分配。 三、 关机流程 关机,按下开关键,键盘检测模块向数字逻辑部分发出一个关机请求信号,CPU既撤消开机维持信号,执行关机程序,供电模块撤消供电,射频和逻辑电路立即停止工作,从关机。如果在开机状态下强制关机(取下电池)也有可能会造成内部软件故障。另外手机还包含其它软件工作流程如充电流程、电池监测、键盘扫描、测试流程等。 手机软件的常见故障及维修 软件故障的认识 4•4•1 什么是软件故障 在上面的节章中我们已经大概了解了软件及单片机的系统,现在让我们来了解一下什么是软件的故障。在手机中,会引发控制系统不正常有两种情况:一方面是软件故障 (如存储器、CPU虚焊、损坏,数据输送通道有问题);另一方面是软件数据丢失或者错乱软件问题。所以,我们定义:一切由CPU、存储器的数据,程序出现问题 (如错乱、损坏、丢失、中毒等等)而引起的各种各样的故障现象,统称为软件故障 4•1•2软件故障的表现 由软件引起的故障是千奇百怪的,但归纳起来主要的有四个方面: 1、 软件的错乱、损坏在手机的屏幕显示返厂维修等信息,其主要表现有: A、显示“联系服务商(CONTACT SERVICE)” B、显示“电话无效,联系服务商(PHONE FAILED SERVICE)” C、显示“软件出错(WRONG SOFTWARE)” D、显示“请等待输入八位特别码(Please Wait To Enter Special Code)” E、显示“非法软件下载(illegal software loaded)” 2、用户自行锁机但又无法开锁,所有的原厂密码均别改动,出厂开锁密码无效,这种情况也是软件故障。 3、电路正常的情况下,出现不开机、不入网、定屏死机,无信号,低电告警、无发射故障,也属于软件故障的范畴。 4、它的软件故障。 4•1•3 软件故障的判定 在手机的故障中,有些故障是很显而易见是由软件问题而引发的,如手机被锁等,只需处理软件OK!有也可以通过开机电流来判断,去手机不开机,我们一般可以观察 其开机电流来大致判断,比如8088开机在30mA左右定一会回零。对于定屏死机,比如说夏新A8大屏不显示,小屏定屏也属软件故障;对于能开机的软件故障, 我们一般是先要观其现在的版本号,例如三星手机,西门子手机、TCL手机等,由于老版本程序存在着教多的隐藏故障,一般采用更新版进行升级。另外还要注意对应版 本的问题,比如TCL就有不同显示屏的对应版本号,波导 S1000出线“bad software”(软件坏了)此故障多是软件版本不对引起的,只要写对软件版本就可以解决问题。另外,S1000的新旧模块和新旧LCD的组合要选择合适的软件版本, 否则会出现 “bad software” 故障。例如:旧LCD+旧模块,适用软件是409AM11B。19A,如果错用了412KM12A。21A或412KM12A。20F均会出现“bad software”。旧模块,适用软件是412KM12A.21A,如果错用了409AM11B.19A或409AM11B.19F。均会出现“bad software”等。三星机也有不同版本的对应升级程序。当然也有修理出来的软件故障,这是由于厂家对程序进行硬件跟踪对码工作,导致更换相应元件后而出现软件故障不能正常使用。比如NOKIA手机从DCT3都一直硬件对码加密措施;现在三星比如V208说机也采用了硬件对码技术,对我们的软件维修带来了阻碍。 第二节 手机软件故障处理技巧 CPU通过读取到的内部指挥手机工作,这就要求软件内容必须正确,不能 丝毫的差错,遇到软件故障应按一下方法进行处理。 4•2•1 缩小故障范围 判断故障需先将故障范围缩小,并要确定故障类型,既属于硬件故障(如存储器本身损坏)这是内部软件故障。若是硬件故障,在却保其无焊接不良的情况下,应对其进行 更换。若是软件故障,必须用软件维修仪来重新写软件。维修实践中发现,手机的软件绝大多数出在码片,并多数是芯片中的数据丢失或出错 4•2•2 处理故障技巧 手机出现软件故障,有免拆机和拆机两种方式进行处理,下面介绍两种方式的特点。免拆机方式就是借助专门的软件维修设备,配合电脑,在不拆机的情况下对手机软件故 障进行处理。比如目前较好的全功能数码手机软件故障维修仪,可处理如锁机、显示“联系服务商”、“话机坏,请送修”、“输入保密码” 、 “软件环” 、 不识 卡、不入网、黑屏、低电报警故障,用免拆机方式处理软件故障很方便,不用拆机,不改变手机的串号IMEI,对手机内部电路也无须影响。 免拆机处理方式不是很万能的,如果手机不能开机或碰到其他一些没有免拆机处理程序的品牌手机;遇到软件故障只有将手机的码片或字库用热风枪吹下,用万能编程器(如LABTOOL-48),配电脑进行重写(电脑中事先应存有各种手机的数据资料),即用电脑内已有的正常数据覆盖故障手机中的数据,如果找不到故障手机同型号数据,则只有自己进行扩充,需先找一台同型号手机,将其码片拆下,用编程器读出其中数据,存进电脑即可。拆机软件维修仪不适用于码片和版本合二为一的机型(早斯的手机如摩托罗拉L2000、西门子2588、摩托罗拉T2688等。现在的新型手机如摩托罗拉系列包括V988、V60等)无论用免拆机软件维修仪还是用拆机软件维修仪,写资料前都要查看手机的版本,即使是同一类型的手机,由于其生产日期和产地的不同,其版本号可能不同,所以,在维修手机过程中,对软件的处理一定要核对其版本,否则会造成不开机或某些功能失效等故障。另外,很多手机的字库采用了BGA封装,如果没有十分把握,特别是初学者就千万不要去动他,因为BGA封装的集成电路对焊接技术要求很高,在重装要使用专门的焊接工具(BGA置锡工具),否则会越修越复杂。 第三节 用软件维修仪对软件故障进行处理的方法 由于软件故障的处理在手机维修中的重要性,使得从事手机维修仪生产的厂家推出了各种各样的软件故障维修仪。如上所述的维修处理技巧中已提及,从处理的方法来分,主要为以下几大类:一类是将字库或码片拆下来重写,-48以及其它类型的编程器;另一类是免拆机的软件修复。而在免拆机情况下对手机软件的重写,又可分为两种情况:一种情况是用免电脑、免拆机的软件维修仪进行修复;另一种情况用电脑、免拆机的软件维修仪进行修复。虽然目前处理手机软件的仪器工具很多,但总的来说都是利用维修软件及工具将手机内单片机系统出错的程序资料重写或覆盖并进行调校。 4•3•1 用带电脑需拆机软件仪进行维修的方法 这种方法是将正确码片或字库的数据资料读出存放于电脑当中,当手机出现软件故障,将故障机的码片或字库取下来,放上万用编程器去重新写入软件资料,然后重新焊回码片或字库。些方法在早期的数码手机维修当中用的较多,原因是早期的手机码片或字库多容易取下来读和写,但由于近期生产的手机字库大多为BGA封装,不便取下来。而且厂家也在软件上采取了相应的加密措施,使的有一些手机的码片或字库不能拆下来读写,使得这种方法存在局限性,将逐渐被弃用。 4•3•2 用免电脑免拆机软件仪进行软件维修的方法 在软件故障当中有一些只是软件错乱造成的,如“手机被锁”这一类型的故障就只要处理码片资料就可以解决,由于软件数据量不大,采用简单的单片机就可以处理。但由于字库数据量较大,采用这种方法一般的单片机就无法达到要求,所以在处理字库引起的软件故障中用的很少。这种方法的优点是操作简单,不需要拆机。缺点是由于单片机功能欠缺家上存储器容量有限,只能处理一些简单故障。如图4-3-2所示的就是用于修改DTC4 串号的免电脑免拆机的软件维修仪。 4•3•3 用电脑免拆机软件仪进行软件维修的方法 由于存储器数据容量太大和采用BGA封装,所以采用前面的两种方法都不能很好解决问题。存储容量的增大,最好借助于电脑。为了不拆字库,最好用免拆机的方法通过手机的外部数据接口来对手机软件进行修复。这种方法就是带电脑免拆机的软件维修方法,在近期的手机维修当中用的较多。这种方法的特点是:一方面将手机软件存资料入电脑,由于电脑存储器容量大,因此可以将大量的手机软件资料存入;另一方面利用手机的外部数据接口,配合相应的驱动程序,可以将手机和电脑连接在一起进行通信,将软件资料从电脑传输到手机,进行软件修复。带电脑免拆机的软件故障维修仪很多,但大多数是将手机数据软件存放于电脑,然后通过电脑串口输出,经过RS232接口与手机进行通信。摩托罗拉手机的数据接口与其它手机不一样,采用了专用的接口电路,所以数据从串口输出后要经过一个专用接口才能写入手机,这种设备我们通常城之为“EMMIBOX”。还有集所有软件仪功能于一体的“BOX王”。上述这几种方法各有其特点,但目前用的最多且最有效的方法是第三种方法。

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧