【问题标题】:How do I send data with USB and read with driver?如何使用 USB 发送数据并使用驱动程序读取?
【发布时间】:2017-05-07 21:19:09
【问题描述】:

通过我的 USB 连接,我收到了一些命令,我​​想让它们对我的驱动程序可读。

第一个字符是字母 S,然后是几个数字 (4)。 我想将这些数字从 asci 转换为十进制,然后在其他函数中将它们写为 HEX。最大大小可以是 20 位。

由于我是 C 新手,所以我在转换时遇到了问题。

如果有人能给我一些建议,我会很高兴。

u8 x;
u8 xx;
u8 xxx;
u8 xxxx;
u32 y;

void ProcessCommandUSB(u8 b_Data[USB_COMMAND_LENGTH],u8 b_DataLength) 
{ 
    switch (b_Data[0])  // process first byte
    {
    case '\r':  // ignore
        break;

    case '\n':  // ignore
        break;

    ////// SPEED ///////
    case 'S':
        x= b_Data[1];
        xx= b_Data[2];
        xxx= b_Data[3];
        xxxx= b_Data[4];

// I NEED TO CHECK IF VARIABLES ARE NUUMBERS, OTHERWISE ERROR.
if (x,xx,xxx,xxxx =='0')|(x,xx,xxx,xxxx =='1')|(x,xx,xxx,xxxx =='2')\
  |(x,xx,xxx,xxxx =='3')|(x,xx,xxx,xxxx =='4')|(x,xx,xxx,xxxx =='5')\
|(x,xx,xxx,xxxx =='6')|(x,xx,xxx,xxxx =='7')|(x,xx,xxx,xxxx =='8')|(x,xx,xxx,xxxx =='9');
{
        //to make asci char, decimal
        x = (x-48)* 1000; 
        xx = (xx-48)* 100;
        xxx =(xxx-48)* 10;
        xxxx -= 48;
    y=x+xx+xxx+xxxx;  
}
    //THIS PART OF CODE DOWN WORKS, AND I WANT TO WRITE THE BYTES RECEIVED 
    //WITH S COMMAND (Y), IN FUNCTION RUN INSTEAD OF 0x034444. 

    else
{
    sprintf(vrni, "D Error\r");
}

USB_Send_String (vrni);
    break;

    case 'D':  // version

        if(b_Data[1] == '<')
        {
            RUN(REV, 0x034444);
            sprintf(vrni, "nazaj\r");

             ....... //REST OF THE CODE WORKS

【问题讨论】:

  • 您的意思是xx = (xx-48)* 100;xxx =(xxx-48)* 10;?在这两行中我看不到你的(x-48) 的意义。
  • 是的!抱歉弄错了。
  • 您的意思是对编码错误感到抱歉,还是对发布不是您的代码的代码表示抱歉?
  • “我需要以十六进制格式合并 X 变量” - 只需添加它们 x + xx + xxx + xxxx。我假设输入是十进制的,因为您将数字乘以10 等。没有“十六进制格式”之类的东西,数字以二进制形式存储。如果您想以人类可读的十六进制格式输出数字,您可以使用带有格式说明符的printf 系列,例如%05X
  • 顺便说一句,除非您打算执行到下一个 case,否则您需要在 case S: 代码块的末尾添加一个 break;

标签: c char hex decimal ascii


【解决方案1】:

此示例显示了一种将四个十进制字节转换为数字然后输出为十六进制的方法。

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

int main(void){
    char message[24];
    char b_Data[] = "S9876";
    unsigned num;
    if(b_Data[0] == 'S') {
        if(isdigit(b_Data[1]) && isdigit(b_Data[2]) && 
                                 isdigit(b_Data[3]) && isdigit(b_Data[4])) {
            num = (b_Data[1] - '0') * 1000 + 
                  (b_Data[2] - '0') * 100 + 
                  (b_Data[3] - '0') * 10 + 
                   b_Data[4] - '0';             // use '0' not magic number
            sprintf(message, "%05X", num);
            printf ("%s\n", message);
        }
    }
    return 0;
}

程序输出:

02694

顺便说一句,您的 x 8 位变量不足以容纳您分配给它的值。

【讨论】:

  • 非常感谢您的好意和帮助,但我不明白输出是如何变成 02694 的?如果我现在理解正确,我只需要写 unsigned num 而不是 0x034444 (在函数 RUN 的情况下 R)
  • 十进制输入9876 是十六进制02694,它是使用%05X 格式说明符创建的。
  • 谢谢,我现在清楚多了,如何继续我的项目!
  • 我仍在努力如何使用我现在在下一个函数 RUN 中获得的这个十六进制 nmb,而不是 0x034444。我希望可以随时更改速度。
  • 不清楚您要做什么,最好提出一个新问题,确切说明当前问题是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多