c++builder xe10.3 fmx IdTCPClient 接收问题。

titan_ysl 2018-12-28 06:56:47
我在线程里用IdTCPClient接收图像数据,为了能随时中止接收,用了ReadBytes函数,但是遇到下面的问题,请看代码。

char Buffer[500];
int nBytes;
DynamicArray<Byte> tmp;
tmp.set_length(500);
IdTCPClient1->IOHandler->CheckForDataOnSource(50);//等待50ms
nBytes=IdTCPClient1->IOHandler->InputBuffer->Size;
if(nBytes==0) return false;
IdTCPClient1->IOHandler->ReadBytes(tmp,nBytes); //读数据
BytesToRaw(tmp,Buffer,nBytes);
Buffer[nBytes]=0;


上面的代码,这行有问题,tmp.set_length(500); 帮助里说DynamicArray<Byte>必须要设置字节长度,但设置了后 IdTCPClient1->IOHandler->ReadBytes(tmp,nBytes); 就收不到数据,不进行设置倒是能工作,但是整段代码多运行几次后,在有的机器上会报错,Access violation at address,不知有知道怎么解决吗?
...全文
829 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
titan_ysl 2019-02-12
  • 打赏
  • 举报
回复
问题解决了,Access violation at address是别的代码出错了,与这里无关的,不过前面的代码在长时间运行时,如因系统做别的事产生卡顿,使得程序来不及处理数据,可能导致缓冲区溢出而连接断开。这时就需要程序能自动重连。修改的代码如下。  TIdBytes tmp; int nBytes; static bool ReceiveReset=false; try { tmp.set_length(0); while(IdTCPClient1->IOHandler->InputBufferIsEmpty()) { IdTCPClient1->IOHandler->CheckForDataOnSource(250); IdTCPClient1->IOHandler->CheckForDisconnect(); //如连接中断,则在程序读完缓冲区后,此函数会产生异常。 if(IdTCPClient1->IOHandler->InputBufferIsEmpty()) break; } nBytes=IdTCPClient1->IOHandler->InputBuffer->Size; if(nBytes==0) return false; ReceiveReset=false; IdTCPClient1->IOHandler->ReadBytes(tmp,nBytes); //读数据 BytesToRaw(tmp,BufferTemp,nBytes); BufferTemp[nBytes]=0; } catch(...)  //这里,捕捉到CheckForDisconnect因中断连接时产生的异常重新连接。  { if(ReceiveCheckBox->IsChecked==false) return false; ReceiveErrorFlag=true; if(ReceiveReset==false) { ReceiveReset=true; //仅重连一次,如仍不正常,则不重连。 IdTCPClient1->Connect(); return false; } Sleep(1000); return false; }
我不懂电脑 2019-01-01
  • 打赏
  • 举报
回复
直接使用最基本的byte指针,不用 DynamicArray
ooolinux 2018-12-29
  • 打赏
  • 举报
回复
500个字节是不是太少了,起码弄个32k什么。
titan_ysl 2018-12-28
  • 打赏
  • 举报
回复
ReadBytes 是最基本的,ReadInt64和ReadStream等其它的读函数都是调用它的,如ReadBytes都有问题,其它 的都没跑了。 ReadBytes是最自由的,所以我用它来读。可以实现非阻塞。 现在我发现好像上面的代码没问题,是别人的机器速度慢,数据堆积起来超出了我开的空导致访问冲突。
ooolinux 2018-12-28
  • 打赏
  • 举报
回复
没用过ReadBytes,试过ReadInt64接收流长度和ReadStream接收流。
源码下载地址: https://pan.quark.cn/s/48210ff050c9 在生成具备死区间隔的脉冲宽度调制(PWM)信号时,STM32微控制器主要运用高级定时器(例如TIM1、TIM8)或通用定时器(如TIM2、TIM3、TIM4),这些定时器因其丰富的功能特性,能够支持复杂的PWM信号输出。 在当前应用场景下,死区间隔被设定为1微秒,此设置旨在电机驱动场景中防止功率开关器件的直通状态,避免电流尖峰,从而保护整个电路系统。 同时,CH1、CH2、CH3三个通道之间的相位间隔为3微秒,这种相位调制方式可用于三相电机的控制,达成对电机转矩的精准调控。 为了使STM32的定时器能够正常工作在PWM模式,需要进行一系列配置操作。 这些操作通常包括以下环节:1. **定时器初始化**:设定定时器的预分频器(Prescaler)参数,目的是获得期望的计数速率,例如,当系统时钟频率为72MHz,而目标PWM频率为50kHz时,预分频器的值应为72M/50K=1440。 2. **自动重载值(ARR)配置**:自动重载寄存器(ARR)的数值决定了PWM信号的整体周期。 以周期为20μs(对应1/50kHz)为例,ARR的值应设为20-1=19。 3. **比较通道选择**:涉及CH1、CH2、CH3等通道,它们分别与TIMx_CCR1、TIMx_CCR2和TIMx_CCR3寄存器相联系,通过设定这些寄存器的具体数值,可以控制各个通道的PWM占空比。 4. **死区时间设定**:利用TIMx_BDTR寄存器中的DTG字段来设定死区时间。 对于1微秒的死区间隔,必须依据定时器的工作模式与系统时钟速率来计算适宜的DTG参数。 5. **定时器启动**:完成所有配置后,使能定时器,PWM波形将...
代码下载链接: https://pan.quark.cn/s/38779f6f0507 《美食推荐系统的设计与实现》是一篇专注于美食推荐系统构建与运作的学术研究论文,其核心探讨的是如何设计并构建一个美食推荐系统,以更好地满足用户对美食的多样化需求并提升整体体验。该论文涵盖了美食推荐系统的需求调研、系统架构规划、系统开发执行以及系统质量检验等多个关键环节。在需求调研部分,论文首先阐述了中国餐饮行业的演进态势和城市生活节奏的提速,并强调了人们对饮食选择多样性和优化效果的追求。接着,论文强调了美食推荐系统在满足用户美食需求方面的必要性和核心价值。在系统架构规划部分,论文详细描述了美食推荐系统的整体布局和各功能模块的设计,包括用户信息管理单元、美食资讯管理单元、团购活动管理单元和推荐算法单元等。此外,论文还介绍了系统的数据结构设计和数据库构建方案,并采用了PHP+MYSQL+APACHE技术平台进行系统开发。在系统开发执行部分,论文记录了系统的构建过程,涉及前端与后端开发、数据库设计构建、系统测试及调试等环节。在系统质量检验部分,论文展示了系统的评估结果,涵盖性能测试、功能验证和安全防护测试等。该论文全面呈现了美食推荐系统的构建过程,有效满足了用户对美食的个性化需求与优化目标,展现出显著的实用价值和广阔的应用潜力。知识点:1. 美食推荐系统的需求调研,涉及中国餐饮业的发展态势、城市生活节奏的加快,以及人们对饮食选择多样化和优化效果的追求。2. 美食推荐系统的架构规划,包括系统的整体布局和功能模块设计,数据结构设计,以及采用PHP+MYSQL+APACHE技术平台进行系统开发。3. 美食推荐系统的构建过程,涵盖前端与后端开发、数据库设计构建、系统测试及调试等环节。4. 美...

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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