如何设置死循环处理数据

herozhang002 2010-04-11 09:41:11
在用Pcomm控件设计串口通信程序后,需要对接收到的数据进行处理.一旦缓冲区内有数据,sio_read()将其读入ibuf内,但是数据处理机制似乎无法触发.于是,想在载入中断后用个死循环来处理数据,这样如果中断来了就处理中断,中断没来就处理数据,但是这个死循环在哪里设置以及如何设置呢?高手帮帮忙..(好像不少单片机就是这个处理模式)

void __fastcall TForm1::OpenBtnClick(TObject *Sender)
{
int Ret;
Ret=sio_open(portindex); //打开串口
ReceiveMemo->Clear();

sio_ioctl(portindex,B9600,P_NONE|BIT_8|STOP_1); //串口初始化,包括端口号,波特率,以及校验位数据位停止位
sio_SetReadTimeouts(portindex,500,100); //500ms内每隔100ms读一次输入缓冲区,若有数据就跳出循环

void __stdcall cntirq(int); //设置中断函数
sio_cnt_irq(portindex,cntirq,1); // 启动中断处理函数
}

void _stdcall cntirq(int port) //中断处理函数;
{
int iquelen;
int rlen;
char *ibuf=new char[20480];
iquelen=sio_iqueue(portindex); //获取输入缓冲区字符的长度iqueueLength
rlen=sio_read(portindex,ibuf,iquelen); //将输入缓冲区字符内容读到输出缓冲区ibuf 内
for(int i=0;i<iquelen;i++)
{
RxData[i]=ibuf[i];
}
//RxData[i]这是要处理的数据
sio_flush(portindex,1); //清空输出缓冲区内的字符
}

...全文
235 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjq2003 2010-04-15
  • 打赏
  • 举报
回复
再加个线程就可以了吧,不影响你整个程序运行,
pcomm也有中断处理函数
int (WINAPI *sio_cnt_irq)(int port, VOID (CALLBACK *func)(int port), int count);
有数据来了就会进CALLBACK *func函数
herozhang002 2010-04-11
  • 打赏
  • 举报
回复
数据来源于一个组合装置,A每秒采样一次,B每20ms采样一次,数据处理以周期较长的A为准,这样的话解码和输出显示周期也就是1s

同一串口 分1s、20ms、来循环 接收串口数据?
[/Quote]
herozhang002 2010-04-11
  • 打赏
  • 举报
回复
这样子好像可以,我明天试试,先谢啦..
[Quote=引用 5 楼 zhouzhangkui 的回复:]
引用 3 楼 herozhang002 的回复:
死循环能在中断函数外,在void __fastcall TForm1::OpenBtnClick(TObject *Sender)内吗?

引用 2 楼 zhouzhangkui 的回复:
C/C++ code

while(rlen>0)
{
//your code
}


C/C++ code

while(1)
……
[/Quote]
周药师 2010-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 herozhang002 的回复:]
每次解码的数据分两段A和B,A的采样周期1s,B的采样周期20ms,解码后的数据输出显示周期是1s,如果
while(rlen>0)
{
//your code
}
这样的话,会不会出现冲突?
[/Quote]
同一串口 分1s、20ms、来循环 接收串口数据?
周药师 2010-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 herozhang002 的回复:]
死循环能在中断函数外,在void __fastcall TForm1::OpenBtnClick(TObject *Sender)内吗?

引用 2 楼 zhouzhangkui 的回复:
C/C++ code

while(rlen>0)
{
//your code
}
[/Quote]

while(1)
{
OpenBtn->Click();
}
herozhang002 2010-04-11
  • 打赏
  • 举报
回复
每次解码的数据分两段A和B,A的采样周期1s,B的采样周期20ms,解码后的数据输出显示周期是1s,如果
while(rlen>0)
{
//your code
}
这样的话,会不会出现冲突?
herozhang002 2010-04-11
  • 打赏
  • 举报
回复
死循环能在中断函数外,在void __fastcall TForm1::OpenBtnClick(TObject *Sender)内吗?
[Quote=引用 2 楼 zhouzhangkui 的回复:]
C/C++ code

while(rlen>0)
{
//your code
}
[/Quote]
周药师 2010-04-11
  • 打赏
  • 举报
回复

while(rlen>0)
{
//your code
}
周药师 2010-04-11
  • 打赏
  • 举报
回复

while(rlen>0)
{
//your code
}

1,317

社区成员

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

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