串口读取数据只能一次读取17个字节,写可以写256
{
speed_t speed;
int i=0;
int fdt,c=0,num;
struct termios oldtio,newtio;
speed = getBaudrate(115200);
fdt=open(Dev,O_RDWR | O_NONBLOCK| O_NOCTTY | O_NDELAY);
if(fdt<0)
{
perror(Dev);
exit(1);
}
//save to oldtio
tcgetattr(fdt,&newtio);
//clear newtio
bzero(&newtio,sizeof(newtio));
// newtio.c_cflag = speed|CS8|CLOCAL|CREAD|CRTSCTS;
//newtio.c_cflag&=~CSIZE;
oldtio.c_cflag |=CS8;
newtio.c_cflag = speed|CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
//newtio.c_oflag &=~OPOST;
newtio.c_oflag &=~OPOST;
// newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/*Input*/
//printf("newtio.c_cflag=%x\n",newtio.c_cflag);
tcflush(fdt,TCIFLUSH);
tcsetattr(fdt,TCSANOW,&newtio);
// tcgetattr(fdt,&oldtio);
//printf("oldtio.c_cflag=%x\n",oldtio.c_cflag);
return fdt;
}
void read_port(void)
{
char dev_id[32];
int kj_id,ret;
FD_ZERO(&rd);
FD_SET(fd,&rd);
timeout.tv_sec = 1;
timeout.tv_usec = 500;
char read_tmp[256];
int i;
retval = select (fd+1,&rd,NULL,NULL,&timeout);
char fbuf[256];
switch (retval)
{
case 0:
printf("no data input within 1s.\n");
break;
case -1:
perror("select");
break;
default:
memset(fbuf,0,sizeof(fbuf));
if((nread=read(fd,read_tmp,256))>0)
{
printf("%d\n",nread);
printf("read1:%s\n",read_tmp);
}
// tcflush(fd,TCIOFLUSH);
SERIAL_DATA_SET getSerialData;
printf("nlen :%d\n",nread);
// read_tmp[nread+1]="\0";
// read_tmp[256]="\0";
printf("%s\n",fbuf);
char buf[512];
printf("%s\n",read_tmp);
memset(&getSerialData, 0, sizeof( SERIAL_DATA_SET));
xml2s_get_serial_req((const char *)fbuf, &getSerialData);
//ret=memcpy(judgmentbuf,read_tmp[0],1);
char xmlData[512];
printf("Resurt:%d\n",getSerialData.Resurt);
printf("DevID:%s\n",getSerialData.DevID);
printf("SNnum:%s\n",getSerialData.SNnum);
memset(xmlData,0,sizeof(xmlData));
sprintf(xmlData,
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
"<GET_SERIAL_RECORDS_RES>\n"
" <Resurt>%d</Resurt>\n"
" <DevID>%s</DevID>\n"
" <SNnum>%s</SNnum>\n",
getSerialData.Resurt,
getSerialData.DevID,
getSerialData.SNnum
);
printf("%s\n",xmlData);
if(ret<0)
{
perror("judgmentbuf");
}
printf("11\n");
if(getSerialData.Resurt==1)
{
memcpy(buf,read_tmp+1,9);
printf("888\n");
//kj_id= atoi(buf);
ret=set_config_param_str("/mnt/nand/cms.cfg","DevID",buf);
if(ret<0)
{
printf("set DevID error\n");
}
ret=get_config_param_str("/mnt/nand/cms.cfg","DevID",dev_id,32);
if(!strcmp(buf,dev_id))
{
int ii;
char serialRepaly[512];
sprintf(serialRepaly,
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
"<GET_SERIAL_RECORDS_RPY>\n"
" <Resurt>%d</Resurt>\n"
" <DevID>%s</DevID>\n"
" <SNnum>%s</SNnum>\n",
1,
getSerialData.DevID,
getSerialData.SNnum
);
ii=write(fd,serialRepaly,sizeof(sendpack));
printf("%s\n",serialRepaly);
if(ii==sizeof(sendpack))
{}
else
{
printf("send error \n");}
//
if(sendnum<65535)
{
sendnum++;
}
else
{
sendnum_times++;
sendnum=1;
}
}
}
msleep(500);
fflush(stdin);
#if 0
if(recenum<65535)
{
recenum++;
}
else
{
recenum_times++;
recenum=1;
}
#endif
}
}
相关推荐
嵌入式Linux Modbus RTU传感器读写:串口配置与协议解析
串口通信是嵌入式系统与工业传感器交互的基础,而Modbus RTU作为经典的现场总线协议,凭借简单可靠、低成本的特点,成为数据采集场景中事实标准。在嵌入式Linux环境下,实现Modbus RTU通信涉及串口参数配置、原始模式切换、CRC16校验、字节序处理与轮询调度等关键环节,每一个细节都直接影响通信稳定性。该技术广泛用于温湿度传感器、压力变送器等设备的远程监控与数字化工场改造,尤其适合存量设备低成本接入新系统。从termios串口初始化到多从机轮询,系统梳理了完整的工程实践思路,并结合真实踩坑案例,提供
ESP32串口打印全解析:从基础调试到高级应用实践
串口通信是嵌入式系统开发中的基础技术,它通过异步串行协议实现设备间的数据交换。其原理基于UART硬件模块,将并行数据转换为串行比特流进行传输。在物联网和嵌入式开发领域,串口打印技术具有重要价值,它不仅是程序调试和状态监控的核心手段,还能实现设备配置、数据输出和性能分析等功能。对于ESP32这类双核Wi-Fi/蓝牙物联网芯片,串口打印更是开发调试的“生命线”。在实际应用场景中,开发者常需处理传感器数据采集、设备间通信和系统状态监控等任务。本文聚焦ESP32在Arduino框架下的串口打印实践,深入讲解prin
基于TencentOS-tiny实现甲醛传感器(英国达特 WZ-S)数据解析思路及实现
1. 甲醛传感器 本文使用的是英国达特DART公司生产的 WZ-S型 甲醛检测传感器。 WZ-S利用电化学原理对空气中存在的CH2O进行探测,直接将空气中的甲醛气体含量转换为浓度值,并使用数字方式输出,方便使用。 1.1. 引脚说明 1.2. 技术指标 1.3. 输出数据 传感器上电后默认状态为主动输出,即传感器主动向主机发送串行数据,时间间隔为 1s。 2. 使用USB转串口查看输出数据 2.1. 传感器主动模式上报 直接使用UBS转串口连接传感器的VCC、GND、TXD、RXD,打开串口助手,波特
DMA技术详解:从工作原理到串口ADC实战与避坑指南
在嵌入式系统中,数据搬运效率直接决定系统实时性。CPU频繁参与数据搬运会带来巨大的算力开销,DMA(直接存储器访问)因此成为关键硬件机制。它通过专用控制器在外设与内存间自动传输数据,仅在开始和结束时占用CPU,极大释放算力,尤其适合串口、ADC等高频外设的大块数据交互。理解DMA的请求-握手-搬运-中断完整生命周期,以及普通模式、循环模式、内存到内存等传输模式的适用场景,是高效开发的基础。实际工程中,串口不定长接收常配合空闲中断读取DMA剩余计数,ADC连续采样则依赖循环模式与双缓冲避免覆盖;带Cache的
树莓派Pico串口通信实战:从UART原理到MicroPython调试全攻略
串口通信是嵌入式开发中最基础也最关键的技能之一,无论是传感器数据采集、设备控制,还是与上位机交互,UART始终是连接硬件世界的通用语言。理解UART的硬件特性、电平标准和数据帧格式,是搭建稳定通信链路的前提。在实际工程中,开发者常面临引脚映射冲突、3.3V与5V电平不匹配、数据丢帧乱码等挑战,掌握系统性的排查方法至关重要。MicroPython为树莓派Pico提供了简洁的UART编程接口,结合协议设计、缓冲区管理和调试工具(如逻辑分析仪、pyserial),可高效实现从基础收发到复杂多设备组网的应用。本文围


