串口通信问题,忍痛再问!!
我的串口数据接收程序(用c语言实现)通过中断接收数据,放入一个数据段中,然后在主程序中通过一个不停的循环来检测数据段中是否有新数据到来,有,就将新数据显示在屏幕上,没有就继续循环,(这样是不是有些画蛇添足,用了中断,还用相当于轮询的方式?),同时,我发现每次通过主程序中的检测轮询部分,然后显示数据的时候,一显示就有很多个数据(我设置了一个标记,可从屏幕上看出是不是在同一个检测轮询程序中显示出来的数据),然而从理论上分析,接收两个数据之间的空闲时间间隔(即没有中断处理的时间间隔)相对于cpu的处理速度来所是很长的,也就是说,对cpu来说,在没有中断处理的时间间隔内,cpu可以轮询检测很多次,如果这样的话,那怎么轮询检测一次就显示很多数据呢?应该只显示一个数据才对呀!假设我发端以960字节/s发送数据,也就是我发完第一个数据后,要隔960分之一秒再传送第二个数据,而对于cpu处理速度来说,960分之一秒内我可以检测轮询很多次,也就是说这期间我的检测轮询程序会把刚刚发过来的第一个数据接收并且显示了,从而第二个数据来的时候,我的检测轮询程序会发现还是只有一个新数据过来(因为第一个我已经接受过了),所以这次也是这能接受并且显示一个数据,可是实际情况却是显示了几个数据,是不是我哪里理解有误呢?我的程序在《rs232串口通信的若干问题,急,愿100分相送》这个问题中已经贴过了,如果有兴趣的可以看看,拜托了!!!真的是很急!!也是从csdn上收集的,请看看问题出在哪里?谢谢,如果彻底解决了,一定给100,困惑很久了!下午也问了这个问题,没人给答复,白白的送了100分,如果有人解答了,本人诚愿再给100分,期待!!!
还有,谁能告诉我下面这些语句都有什么用呢?我看不懂他的用意
outportb (0x20, 0x0B);/*这是不是相当于disable()屏蔽中断?*/
IntCom = (2 - ((inportb (0x20) & 0x18) >> 3));/*IntCom是0或者1,表示com的端口,不过我看不懂是怎么实现赋值的,而微机上的8259A编程讲的不是很详细*/
switch (inportb (com[IntCom].m_nIIR) & 0x06) /*0x06==00000110*/
{
case 0:
com[IntCom].m_nCarrier = (0x80 & inportb(com[IntCom].m_nMSR));
break;/*读MSR是为了清MSI中断,可为什么还要对m_ncarrier赋值呢?*/
case 2: /* DO Nothing */
;
break;
case 4:
outportb(com[IntCom].m_nLCR,inportb(com[IntCom].m_nLCR) & 0x7F);
if (inportb (com[IntCom].m_nRHR) != 0x00)
{
com[IntCom].m_InBuffer[com[IntCom].m_nInTail] = inportb (com[IntCom].m_nRHR);
com[IntCom].m_nInTail = (com[IntCom].m_nInTail + 1) % BUFSZ;
}
break;
case 6 : /* DO Nothing */
;/*LSI中断怎么复位,不是要读LSR吗*/
break;
}
outportb (0x20, 0x20);/*关闭中断*/