Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:如何逐位递归地传输字节?_C_Recursion_Byte - Fatal编程技术网

C:如何逐位递归地传输字节?

C:如何逐位递归地传输字节?,c,recursion,byte,C,Recursion,Byte,我正在尝试编写一个函数,它发送一个16位字并将其存储在另一个变量中。我想做的是取这个字,然后将数据一次一位地传输写入新变量 如果这可以递归地完成,那也太好了。例如,我有函数SendCommanduint32\u t addr,uint16\u t data,在传输一位之后,字节可以移位,并且可以用新数据再次调用函数 我的问题是: 如何一次提取一位并写入新变量? 确定单词结尾并停止调用函数的可能方法是什么? 注:MSB优先 编辑: 我这样做的原因是因为我正在为接受此数据的设备编写伪代码。现在,在我

我正在尝试编写一个函数,它发送一个16位字并将其存储在另一个变量中。我想做的是取这个字,然后将数据一次一位地传输写入新变量

如果这可以递归地完成,那也太好了。例如,我有函数SendCommanduint32\u t addr,uint16\u t data,在传输一位之后,字节可以移位,并且可以用新数据再次调用函数

我的问题是:

如何一次提取一位并写入新变量? 确定单词结尾并停止调用函数的可能方法是什么? 注:MSB优先

编辑:


我这样做的原因是因为我正在为接受此数据的设备编写伪代码。现在,在我的代码中,我正在模拟一个时钟,为此设备指定的格式会在时钟的每个下降沿向寄存器写入一位。

要在一次调用中首先写入MSB,请执行以下操作:

void SendCommand(uint32_t addr, uint16_t data) {    
    volatile unsigned char *dest = (unsigned char *)addr
    for(int i=15; i>=0; --i) {
        *dest = (data & 0x8000) >> 15;
               //     ^^^^^^^^ get MSB
               //               ^^^^^ move the MSB down to the LSB, assuming the
               //                     peripheral wants the bit in the LSB.
        data <<=1;
    }
} //SendCommand

在多个调用中执行此操作需要以某种方式保持位计数。如果没有一个数字,你就无法判断你是否已经把左端的每一位都移走了,或者你已经没有任何1位了。旋转和测试相等性也不起作用,例如,对于0x5555或具有重复位模式的其他值。

。。。为什么一点一点?解释你想要达到的目标。逐位传输本质上归结为一个包含移位操作和掩码操作的循环,我正在为一个将接受此数据的设备编写伪代码。现在在我的代码中,我正在模拟一个时钟,为这个设备指定的格式在时钟的每个下降沿向寄存器写入一位。我将用这些更新来编辑这个问题,但它并没有完全解释为什么必须这样做recursive@DrewMcGowen递归来自我的主管的请求。问题是这是否可能,如果可能的话,如何实现?这里的递归在我看来有点胡说八道。你应该问你的主管为什么他想要递归。我认为这应该行得通,但是当我尝试运行它时,我遇到了一个异常,然后程序很快就关闭了。异常为:0[main]56-REVB 17008 cygwin_异常::open_stackdumpfile:将堆栈跟踪转储到56-REVB.exe.stackdumpG,暂时不确定,但我会仔细检查addr参数,确保它适合您的目标。您是在硬件上测试还是在PC上测试?如果是PC,您可以声明一个未签名的char foo并调用SendCommand&foo,0xbeef以写入有效地址。