天嵌 ARM开发社区

 找回密码
 注册
查看: 2917|回复: 3

wince 6.0 串口 读取 readfile 超时问题

[复制链接]
roger0502 发表于 2013-1-6 10:13:03 | 显示全部楼层 |阅读模式
       现有一个工程 程序启动开启两个线程 一个接收线程(rev_thread),一个接收线程(rev_thread),接收线程(rev_thread)一直工作,发送线程(send_thread)通过 按下触摸屏(OnLButtonDown)触发,每个单独线程工作时,都需要readfile、writefile。触摸屏按下时,先挂起 (SuspendThread)接收线程(rev_thread),再通过标志位(flag) 触发 发送线程(send_thread),待发送线程(send_thread)结束后,恢复(ResumeThread)接收线程(rev_thread),让接收线程(rev_thread)开始工作。经过测试,程序启动后,按下触摸屏,断点测试,程序会卡在发送线程(rev_thread)中的readfile()函数 7-10s。单独建工程测试 接收线程(rev_thread)、接收线程(rev_thread),都能正常工作,不会卡在readfile()函数这里。

附上部分代码:

超时设置:
  COMMTIMEOUTS CommTimeOuts;  
HANDLE Revhdser = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(Revhdser == INVALID_HANDLE_VALUE)
{
  MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
  return FALSE;
}
DCB  dcb;
GetCommState(Revhdser, &dcb);      /* 读取串口的DCB */
dcb.BaudRate = 115200;   
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fParity = FALSE;        /* 禁止奇偶校验 */
dcb.fBinary = TRUE;
dcb.fDtrControl = 0;        /* 禁止流量控制 */
dcb.fRtsControl = 0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;
//设置状态参数
SetCommMask(Revhdser, EV_RXCHAR);     /* 串口事件:接收到一个字符 */
SetupComm(Revhdser, 1024, 1024);     /* 设置接收与发送的缓冲区大小 */
GetCommTimeouts(Revhdser, &CommTimeOuts);  
CommTimeOuts.ReadIntervalTimeout = 10;   /* 接收字符间最大时间间隔 */
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;  
CommTimeOuts.ReadTotalTimeoutConstant = 0;  /* 读数据总超时常量 */
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(Revhdser, &CommTimeOuts);

发送线程 部分代码:
   SuspendThread(hrevThread);//挂起接收线程
   main_tx( );//发送函数   
    ResumeThread(hrevThread); //恢复接收线程


embedsky_lhh 发表于 2013-1-6 11:01:04 | 显示全部楼层
你贴发送和接收部分代码就清楚了,应该是资源抢占问题,两个线程独有用串口设备句柄,如果同时访问极有可能出现异常和挂起线程,你可以加个互斥的同步标识 CRITICAL_SECTION,在读写中加临界区保护就行了
w492901074 发表于 2013-3-31 13:43:34 | 显示全部楼层
标记下,WINCE6.0 串口收发死机
cepoly 发表于 2013-4-17 10:11:44 | 显示全部楼层
目测,问题出现在这两个函数:readfile、writefile
程序会卡在发送线程(rev_thread)中的readfile()函数 7-10s
问题:每次读写有以下操作吗?(我以前也碰到像你类似的问题。)
delete[] buffer; // 注意是delete[] 而不是 delete
CloseHandle(file); // 关闭句柄。
建议:用c语言fwrite fread试试
原因:c++有个文件操作要很好用,特别适合大文件操作,但每次操作都需要关闭句柄再打开,我在开发板上sun cortex-a9 跑,如果写入数据时,紧接着不关闭,而是等到退出函数时才关闭,立刻在串口上给我出现内存泄漏!!!还有写入数据文件时间过长,我写14K数据就要10s(是写入时打开,写入后立刻关闭!!)由于找不到问题,理解不够深入原因,我还是用回原来的C语言。用fwrite fread函数,可以退出函数时再关闭,操作比较灵活,写14K数据(这14K数据不是一次性写入,当时我是先写入获取到的注册表名字 接着获取的数据类型 最后写入数据,直到把所有键值都写入到txt文件再关闭文件,读取也一样),1到2 秒就读写完!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-28 22:46 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表