C-While和IF语句-尝试在X时间后超时

C-While和IF语句-尝试在X时间后超时,c,if-statement,timer,while-loop,serial-port,C,If Statement,Timer,While Loop,Serial Port,我对以下代码有困难 int i = 0; int x = 0; int ch ; int n; while((i < sizeof(buffer) - 1) && (x < (TIMER_FREQ*30))) { //getkey_serial0 returns either a (int)character or 0 if nothing on

我对以下代码有困难

int i = 0;
int x = 0;
int ch ;
int n;

    while((i < sizeof(buffer) - 1) && (x < (TIMER_FREQ*30)))
    {
        //getkey_serial0 returns either a (int)character or 0 if nothing on                                            
        //UART0
        if((ch = getkey_serial0) == 0)
        {
             x++;    //Increment X as there is nothing being received.
        }
        else
        {
            if(ch == '\n')
            {
                 n++;
            }

            if(n < 8){    //Yes I can simplify this but for some reason
            }             //I only just noticed this :/ Anyway, it is
            else{         //just here to avoid saving info I don't need
                 buffer[i] = ch ;
                 i++;
            }
        }
    }
inti=0;
int x=0;
int-ch;
int n;
而((i
由于它读取的输入是无线扫描的结果,扫描的条目数量可能会有很大的变化,因此我需要能够避免无限循环。 最初我只读了11个\n,但这是垃圾,因为我一直缺少我需要的SSID,所以我决定需要某种计时器或方法来帮助我在X时间后打破

定时器频率定义为10

很明显,我正在做一些愚蠢的事情,所以任何建议或提示都将不胜感激。 我通常更喜欢建议来帮助我尝试和思考问题,而不是固定的代码帖子:)尽管我尽了最大的努力,我似乎总是错过一些简单的东西

谢谢


编辑:我应该提到的是,这是一个嵌入式系统(ARM7)

如果您想计时,请查看。它会让你看到系统的挂钟,因此你可以确定是否已经过了太多秒。

如果你想计时,请查看。它会让你看到系统的挂钟,这样你就可以确定是否已经过了太多的秒。

你应该可以访问一个通用定时器中断——通常称为sys_tick()

这种“裸机”应用程序的一般做法是将中断配置为每n毫秒触发一次(我的Cortex M3上经常使用10毫秒)。然后,让ISR更新计数器。您需要确保计数器更新是原子的,因此请使用32位、正确对齐的变量。(我假设你的处理器是32位的,我想不起来了)。然后,您的“应用程序”代码可以根据需要轮询经过的时间


但是——这个讨论可能没有意义。在我的ARM9应用程序中,我们将中断绑定到UART的接收缓冲区。关联的ISR捕获击键,然后执行任何缓冲区管理。这是您的一个选项吗?

您应该可以访问一个通用定时器中断,通常称为sys_tick()

这种“裸机”应用程序的一般做法是将中断配置为每n毫秒触发一次(我的Cortex M3上经常使用10毫秒)。然后,让ISR更新计数器。您需要确保计数器更新是原子的,因此请使用32位、正确对齐的变量。(我假设你的处理器是32位的,我想不起来了)。然后,您的“应用程序”代码可以根据需要轮询经过的时间

但是——这个讨论可能没有意义。在我的ARM9应用程序中,我们将中断绑定到UART的接收缓冲区。关联的ISR捕获击键,然后执行任何缓冲区管理。这是你的选择吗?

你真的是说:

if((ch = getkey_serial0) == 0) { ...
if((ch = getkey_serial0()) == 0) { ...
或者你的意思是:

if((ch = getkey_serial0) == 0) { ...
if((ch = getkey_serial0()) == 0) { ...
如果是后者,这就是为什么程序在给它一个函数指针时从不返回零。您的程序在生成时有很多警告吗?

您的意思是:

if((ch = getkey_serial0) == 0) { ...
if((ch = getkey_serial0()) == 0) { ...
或者你的意思是:

if((ch = getkey_serial0) == 0) { ...
if((ch = getkey_serial0()) == 0) { ...

如果是后者,这就是为什么程序在给它一个函数指针时从不返回零。您的程序在生成时有很多警告吗?

只是一个想法。。。实际上那里没有计时器,只有计时器REQ迭代。循环所需的时间取决于CPU时钟+指令数。我发现,在现代CPU中,您可能会多次读取相同的第一个字符,因为还没有时间接收另一个字符。编辑:很抱歉,没有看到您仅在读取内容时增加索引。你确定getKey_serial0会清除从UART读取的字符吗?@SJuan76老实说,我在递增X的部分添加了一个LED闪光灯,有趣的是,它没有闪烁。我没有太注意这个问题,因为我假设我在LED代码中犯了一些愚蠢的错误,但如果不是这样,那就表明它永远不会返回0,这应该是不可能的,只是一个想法。。。实际上那里没有计时器,只有计时器REQ迭代。循环所需的时间取决于CPU时钟+指令数。我发现,在现代CPU中,您可能会多次读取相同的第一个字符,因为还没有时间接收另一个字符。编辑:很抱歉,没有看到您仅在读取内容时增加索引。你确定getKey_serial0会清除从UART读取的字符吗?@SJuan76老实说,我在递增X的部分添加了一个LED闪光灯,有趣的是,它没有闪烁。我没有太注意这一点,因为我假设我在LED代码中犯了一些愚蠢的错误,但如果不是这样,则表明它永远不会返回0,这应该是不可能的。嗨,谢谢你的建议。遗憾的是,这是在一个嵌入式系统(ARM7)上,所以我没有访问此功能的权限。@Draineh:您使用的是操作系统吗?你有全球计时器吗?我使用过的大多数嵌入式系统都以某种方式跟踪时间。不,我直接编写固件并使用基本引导加载程序加载更新。我有权访问RTC吗?我有一些想法,我可以用它在x时间后生成一个中断,但这并不意味着much@Draineh:如果你能