【问题标题】:Using Clock in C in Raspberry在 Raspberry 中使用 C 语言中的时钟
【发布时间】:2017-06-26 20:33:40
【问题描述】:

我正在尝试在 Raspberry Pi 中创建一个程序。这个程序是C语言的。在项目中,我有两个 LED。第一个用于“EV1”,第二个用于排场“P1”。当我在控制台中单击字符“S”时,项目以 EV1 开始。当我在控制台“g”中单击时,EV1 停止并且盛况开始 60 秒。如果在 60 年代您将“C”字符放入控制台,那么排场在 60 年代后仍然可以正常工作;否则,如果您没有在控制台中放置任何字符或与“C”不同的内容,则排场将不会继续工作并在 60 秒后停止。

问题是如果我在我的代码中输入print()scanf() 参数,控制台仍然等待用户输入一个字符,所以在我输入一个字符后排场工作,在我的情况下我需要排场工作使得我可以同时放入一个字符。

这是我的代码:

#include <stdio.h>
#include <bcm2835.h>
#include <string.h>

#define FAN 16
#define P1 17
#define P2 27
#define GPP 22
#define GPN 20
#define EV1 21
#define EV2 13
#define LAN 19

void LampOn(int a)
{   
        bcm2835_gpio_set(a);    
}

void LampDel(int a,int b)
{
    unsigned int del=1000;

    bcm2835_gpio_set(a);
    bcm2835_delay(del * b);
    bcm2835_gpio_clr(a);
}       

void LampOff(int a)
{
    bcm2835_gpio_clr(a);
}   

void OUTPUT(int c)
{
    bcm2835_gpio_fsel(c, BCM2835_GPIO_FSEL_OUTP);
}

char Taper()
{
    char v;
    printf("put a char: ");
    scanf("%c",&v);
    return v;
}   

int main(int argc, char **argv)
{
    if(!bcm2835_init())
    return 1;

    OUTPUT(17);
    OUTPUT(27);
    OUTPUT(22);
    OUTPUT(13);
    OUTPUT(19);
    OUTPUT(20);
    OUTPUT(21);
    OUTPUT(16);
    LampOff(EV1);

    do
    {
        Taper();
    }while(Taper()!='s');

    while(1)
    {
        LampOn(EV1);
        Taper();

        if(Taper()=='g')
        {

            LampOff(EV1);
            LampDel(P1,60);
        }
    }

    while(1)
    {
        /* Infinite loop */
    }
}

我想添加一个计数器,但这仍然是一个不好的解决方案,因为如果我使用计数器,程序会停止,直到计数器停止。

我该如何解决这些问题?

【问题讨论】:

  • 我真的不知道你在说什么......请添加一些说明。
  • 欢迎来到 SO。这是一个问答网站,那么您的问题是什么?
  • 什么是“盛况”?在英语中,它是一个形容词(Elgar 的“Pomp and Circumstance March”,f'rinstance),在这里你将它用作名词时并不适用。请检查从您的语言到英语的翻译。
  • 几乎可以肯定,行缓冲输入存在某种问题。我不知道你是如何在 Raspberry Pi 上解决这个问题的。但很可能有一种方法可以做到这一点,即记录在案且随时可用。
  • 伙计们谢谢,我很抱歉我的英语不好我会尝试用其他感觉问我的问题,所以在我的程序 1/我需要一个时钟或计时器与其他功能同时工作,在我的情况下,如果我在控制台中放入“C”字符,则使用“printf”语句,程序仍在工作,否则停止工作,所以我的问题是如何放置这个时钟或计数器或计时器? 2/我需要同时运行 2 个或多个动作,那么我该怎么做?最后我的程序没有任何问题,但他没有按照我喜欢的方式工作,所以我该如何解决它如何放置时钟或同时运行多个功能

标签: c raspberry-pi counter


【解决方案1】:

抱歉,如果我误解了您的问题。

基本上你想同时(并发)做两件事:

  1. 控制 LED
  2. 等待用户通过 scanf 进行交互

我想说这里有两个选项,要么将你的 UI (scanf) 分离到一个单独的线程中,要么在非阻塞模式下使用 stdio,这样你就可以读取而不是 scanf。

【讨论】:

  • 嗨 tgregory 感谢您的回复,但我如何在非阻塞模式下使用 stidio?
  • @Sekmani52 看看这个question 阅读所有答案,那些使用 O_NONBLOCK 将标准输入切换到非阻塞模式的答案。请记住,这样其他期望它处于阻塞模式的代码可能会中断。
猜你喜欢
  • 2020-12-19
  • 2016-12-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多