RS232串口问题

问题描述

对于一个打开的串口,连续接收同一数据包,造成内存不断上涨,有什么办法可以释放因接收数据包造成不断上涨的内存?

解决方案

解决方案二:
是什么样子的啊?是一次接收很大的数据,还是每次数据少但次数多啊?我以前做过一个短信模块的,通过串口来的数据是小而次数多,所以就先把它们存到数据库了,再从数据库里读出来。不知道你的是什么样的。
解决方案三:
接受数据包难道你采用一个数组或者ArrayList等形式一致保存下来?如果是这样的话,肯定是涨内存的在我的处理中,接收到的数据放在缓冲区,如果已经处理完毕,则清除这部分的数据,内存就不怎么涨了
解决方案四:
回zhangjie_xiaoke:大概每次数据几十个byte,次数多
解决方案五:
cnming:我是采用一个静态string变量保存接收到的数据,这样可行吗?
解决方案六:
线程+缓存处理方式
解决方案七:
缓存方法能给出代码吗,谢谢
解决方案八:
再次顶起,希望能有高手给出代码
解决方案九:
静态string变量当然要涨了……
解决方案十:
缓存的意义在于这段数据处理之后就没有用了,必须从缓存清除出去,静态string恐怕不好清除把,用一个可变数组比较好,例如ArrayList,每一组指令放在ArrayList的一个Item中
解决方案十一:
#defineMAX1048575#defineBUFFERLEN5242880voidCBulkusbDlg::OnButtonWritestart(){//TODO:Addyourcontrolnotificationhandlercodehere//TODO:AddyourcontrolnotificationhandlercodehereCStringpipename;if(m_combo_bulkwritepipe.GetCurSel()==CB_ERR){MessageBox("请选择要操作的管道","警告");return;}UpdateData(true);m_BulkWrite.bInThread=TRUE;m_BulkWrite.testDlg=this;m_BulkWrite.buffersize=m_nEditWriteBufferSize;m_combo_bulkwritepipe.GetLBText(m_combo_bulkwritepipe.GetCurSel(),pipename);strcpy(m_BulkWrite.pipe_name,(LPCTSTR)pipename);m_writetransfer_info.averspeed=0;UpdateData(false);EnableButton(false,true);SetTimer(1,1000,NULL);CWinThread*wt=AfxBeginThread(BulkWritePipe,//threadfunction&m_BulkWrite);//argumenttothreadfunctionm_BulkWrite.hThread=wt->m_hThread;}voidCBulkusbDlg::OnButtonWritestop(){//TODO:Addyourcontrolnotificationhandlercodehere//TODO:Addyourcontrolnotificationhandlercodeherem_BulkWrite.bInThread=FALSE;EnableButton(true,false);KillTimer(1);m_calwritetime.bInThread=FALSE;}UINTBulkWritePipe(void*pParam){chartemp[80],cc[80];BOOLEANbResult=FALSE;intnResult=0;unsignedlongnBytes=0;unsignedlongnReadBytes=0;intnflag=0,nflag1=0;unsignedlongtotaltoTx=0,toTxNow=0,exitFlag=0,exitFlag1=0,toTxNow1=0,totaltoTx1=0;structCThreadParam*threadParam;CBulkusbDlg*testDlg;HANDLEhDevice;HANDLEhFile;unsignedchar*pbRead=newunsignedchar[1048575];threadParam=(structCThreadParam*)pParam;testDlg=threadParam->testDlg;hDevice=ISP1581_OpenDev();if(hDevice==INVALID_HANDLE_VALUE){strcpy(temp,"Opendevicehandlefailed!Can'twriteto");strcat(temp,threadParam->pipe_name);strcat(temp,".");testDlg->MessageBox((LPCSTR)temp,"TestError");testDlg->m_calwritetime.bInThread=FALSE;return0;}hFile=ISP1581_OpenPipe(threadParam->pipe_name);if(hFile==INVALID_HANDLE_VALUE){strcpy(temp,"Opendriverfailed!Can'twriteto");strcat(temp,threadParam->pipe_name);strcat(temp,".");testDlg->MessageBox((LPCSTR)temp,"TestError");testDlg->m_calwritetime.bInThread=FALSE;ISP1581_CloseDev(hDevice);return0;}HANDLEhFiles=CreateFile("c:\temp\large_file.dat",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL,NULL);unsignedlongfilelen=SetFilePointer(hFiles,0,NULL,FILE_END);curtime=timeGetTime();if(filelen>0)do{exitFlag=0;if(nflag==0)totaltoTx=filelen;do{if(totaltoTx>BUFFERLEN){totaltoTx=totaltoTx-BUFFERLEN;toTxNow=BUFFERLEN;filelen=totaltoTx;}else{toTxNow=totaltoTx;exitFlag=1;}nResult=ISP1581_Vender_ScanOrPrint(hDevice,0x80,toTxNow);if(nResult!=0){threadParam->bInThread=FALSE;wsprintf(cc,"Requestingdatatransferon");strcat(cc,threadParam->pipe_name);strcat(cc,"failed!Aborted.");testDlg->MessageBox((LPCSTR)cc,"TestError");break;}unsignedlongfilelen1=toTxNow;if(filelen1>0)do{exitFlag1=0;if(nflag1==0)totaltoTx1=filelen1;if(totaltoTx1>MAX){totaltoTx1=totaltoTx1-MAX;toTxNow1=MAX;filelen1=totaltoTx1;}else{toTxNow1=totaltoTx1;exitFlag1=1;}nReadBytes=ISP1581_Read(hFiles,pbRead,toTxNow1,1000);if(nReadBytes==-1||nReadBytes==0)break;nBytes=ISP1581_Write(hFile,pbRead,toTxNow1,1500);if(nBytes==-1||nBytes==0)break;}while(exitFlag1==0);}while(exitFlag==0);tertime=timeGetTime();usetime=tertime-curtime;testDlg->UpdateWriteInfo(usetime);threadParam->bInThread=FALSE;testDlg->m_calwritetime.bInThread=FALSE;}while(threadParam->bInThread==TRUE);testDlg->EnableButton(true,false);deletepbRead;ISP1581_ClosePipe(hFile);ISP1581_CloseDev(hDevice);return0;}unsignedlong__stdcallISP1581_Write(HANDLEpipehandle,unsignedchar*sendbuffer,unsignedlongbufferlen,intwaittime){unsignedlongnbytes=0,lasterror=0;inti=0;unsignedlongtmpbufferlen=bufferlen;OVERLAPPEDos;memset(&os,0,sizeof(OVERLAPPED));os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);if(!WriteFile(pipehandle,&sendbuffer[i],bufferlen,&nbytes,&os)){if((lasterror=::GetLastError())==ERROR_IO_PENDING){switch(::WaitForSingleObject(os.hEvent,(DWORD)waittime)){caseWAIT_OBJECT_0:if(!::GetOverlappedResult(pipehandle,&os,&nbytes,FALSE)){lasterror=::GetLastError();}elselasterror=0;break;caseWAIT_TIMEOUT:::CancelIo(pipehandle);lasterror=ERROR_TIMEOUT;break;default:lasterror=::GetLastError();break;}}}if(lasterror!=0){ResetPipe(pipehandle);}CloseHandle(os.hEvent);if(lasterror!=0)return-1;returnnbytes;}c++测试USB的程序原理一样的。

时间: 2025-01-19 14:40:07

RS232串口问题的相关文章

PHP在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4]

php5|应用演示 一. 预先的知识: 什么是RS232/RS484及其应用?       QUOTE:RS232接口就是串口,电脑机箱后方的9芯(或25芯)插座,旁边一般有 "|O|O|" 样标识. 一般机箱有两个,新机箱有可能只有一个.笔记本电脑有可能没有. 有很多工业仪器将它作为标准通信端口.通信的内容与格式一般附在仪器的用户说明书中. 计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式.由于串行通讯方式具有使用线路少.成本低,特别是在远程传输时,避免了

在java中使用图形界面后怎么用按钮Button实现RS232串口的链接PC机上

问题描述 在java中使用图形界面后怎么用按钮Button实现RS232串口的链接PC机上 在java中使用图形界面后怎么用按钮Button实现RS232串口的链接PC机上,求大神啊 解决方案 你的按钮中就实现连接串口启动等代码 http://blog.csdn.net/kabini/article/details/1601324 解决方案二: 为button增加ActionListener,在其事件中实现你要的功能. new JButton().addActionListener(new Ac

串口通信-基于上、下位机通信测控系统的开发(RS232串口)

问题描述 基于上.下位机通信测控系统的开发(RS232串口) 做的毕业设计,A/D转换器及数据采集,RS232串口及数据通信,单片机开发平台.有做过的大神吗?或是知道该如何入手的亲人吗?临近毕业急不可耐,祈求帮助啊!下位机比较简单一个51板搞定,可是上位机怎样实现测试控制啊,用什么软件实现还是在windows下编一个? 解决方案 也就是上下位机的UART通信 上网下载个单片机的UART程序就可以了 上位机就用串口助手之类的小软件 解决方案二: 上位机不需要你编程 直接下载一个 串口助手安装好就可

通讯-模拟开关4067 能不能切换多路的RS232串口信号传输

问题描述 模拟开关4067 能不能切换多路的RS232串口信号传输 为了增加单片机串口之间的通讯距离,拟采用在单片机处增加232芯片来把TTL信号转换后再进行信息的传输,是多个发送,一个接收,我想选用4067模拟开关来选择通讯通道,可以实现吗? 解决方案 用4067可以实现,但是要注意如果你把TTL电平进行转换之后,4067是否支持这个电平呢?4067是支持模拟信号和TTL电平的,可以直接使用TTL电平进行传输,用运放或者电压比较器对信号进行整形和放大即可.当然,将TTL转换成RS232标准电平

RS232串口通讯模块

应为工作需要自己编写的RS232通讯模块,该模块已经编写了蛮久,在实际使用中可能有没有考虑和不完善的地方. //================================================================================= //如果使用该模块请保留该注释,如果被修改或编辑请将修改后的代码发送一份给我 //编写:戴琪英 //E_Mail:qiyingdai@163.com //2000-09-01 //======================

基于ARM9多串口工控主板的嵌入式开发方案

近年来,随着计算机网络的发展和物联网的兴起,将智能仪器接入网络已成为一种趋势,基于以太网/互联网的集中化控制网络架构已逐渐在自动化控制领域被广泛采用,并将成为自动化控制系统的主流.在这种趋势下,嵌入式多串口服务器是以TCP/IP和以太网为基础,实现异步串口(RS232/RS485/RS422)与以太网RJ45接口间的一个转化器,完成串口格式和以太网传输的IP包之间的数据相互转发,从而给串口设备增加联网功能. 工控主板.jpg 目前大多智能仪器使用的是异步串行通信接口RS-232C /485 /4

rs485多路串口通信 。。

问题描述 rs485多路串口通信 .. 1C DM368开发板和一个单片机板通过RS485串口通信. DM368开发板同时发送一组数据给单片机板和云台比如:aa 55 05 00 33 44 14 90 00单片机板接收后返回另一组数据给DM368开发板比如:AA 55 16 00 11 22 33 44 00 00 10 00 32 47 42 47 D2 01 这个程序改怎么写?PS: RS485为半双工 只能读或者只能写. 附上:我已写程序.哪里不对? #include #include

BS页面获取串口数据

问题描述 现在有个项目:二维码扫描枪只能通过RS-232串口通讯读取带汉字的二维码.程序用vs2008C#开发B/S的,想通过页面访问com口获取扫描枪读出的数据?BS怎么调用串口,有代码请兄弟姐妹们给粘粘,小弟不胜感激!或者有别的解决方案也可以,现在就想读出来带汉字的二维码,如果有支持通过USB读取汉字的二维码扫描枪,请把型号提供下! 解决方案 本帖最后由 Myth_NiuNiu 于 2014-08-21 11:49:06 编辑解决方案二:条码扫描器就类似键盘,接上就能用.解决方案三:用C/S

C#windows上位机串口数据接收

问题描述 各位大神帮帮忙!!!感激不尽我这儿有个数显游标卡尺,还有对应的与电脑连接的USB数据线.我做了一个windows界面,想把游标卡尺中显示出来的数据通过串口发送到windows界面的gridview控件里面.C#程序该怎么写 解决方案 解决方案二:你这个数显游标卡尺有API么?根据它提供的API获取数据啊解决方案三:数显游标卡尺的波特率是4800:数据位7位:停止位是2位:校验位为奇偶校验:起始位是1位:端口COM7,跪求程序解决方案四:没有协议上位机怎么能取到数据解决方案五:联系厂家,