C语言实现串行数据转化为并行数据,有什么好的算法吗?

2020-01-07 19:26发布

如题,有16个字节的数据,一个数据对应一个IO口,从IO口输出相应的高低电平,总共有16个IO口,并且需要并行从STM32的一个16位的口比如PA口输出,所以首先需要做串行数据转化为并行数据,把这16个8位的数据转为8个16位数据。
我现在的程序如下:

unsigned char in_data[16];
unsigned int out_data[8];


               out_data[0] |= (0x80 & in_data[15])<<8;
               out_data[0] |= (0x80 & in_data[14])<<7;
               out_data[0] |= (0x80 & in_data[13])<<6;
               out_data[0] |= (0x80 & in_data[12])<<5;
               out_data[0] |= (0x80 & in_data[11])<<4;
               out_data[0] |= (0x80 & in_data[10])<<3;
               out_data[0] |= (0x80 & in_data[9])<<2;
               out_data[0] |= (0x80 & in_data[8])<<1;
               out_data[0] |= (0x80 & in_data[7]);
               out_data[0] |= (0x80 & in_data[6])>>1;
               out_data[0] |= (0x80 & in_data[5])>>2;
               out_data[0] |= (0x80 & in_data[4])>>3;
               out_data[0] |= (0x80 & in_data[3])>>4;
               out_data[0] |= (0x80 & in_data[2])>>5;
               out_data[0] |= (0x80 & in_data[1])>>6;
               out_data[0] |= (0x80 & in_data[0])>>7;                           
                          
               out_data[1] |= (0x40 & in_data[15])<<9;            
               out_data[1] |= (0x40 & in_data[14])<<8;   
               out_data[1] |= (0x40 & in_data[13])<<7;
               out_data[1] |= (0x40 & in_data[12])<<6;
               out_data[1] |= (0x40 & in_data[11])<<5;
               out_data[1] |= (0x40 & in_data[10])<<4;
               out_data[1] |= (0x40 & in_data[9])<<3;
               out_data[1] |= (0x40 & in_data[8])<<2;
               out_data[1] |= (0x40 & in_data[7])<<1;
               out_data[1] |= (0x40 & in_data[6]);
               out_data[1] |= (0x40 & in_data[5])>>1;
               out_data[1] |= (0x40 & in_data[4])>>2;
               out_data[1] |= (0x40 & in_data[3])>>3;
               out_data[1] |= (0x40 & in_data[2])>>4;
               out_data[1] |= (0x40 & in_data[1])>>5;
               out_data[1] |= (0x40 & in_data[0])>>6;

               out_data[2] |= (0x20 & in_data[15])<<10;            
               out_data[2] |= (0x20 & in_data[14])<<9;   
               out_data[2] |= (0x20 & in_data[13])<<8;
               out_data[2] |= (0x20 & in_data[12])<<7;
               out_data[2] |= (0x20 & in_data[11])<<6;
               out_data[2] |= (0x20 & in_data[10])<<5;
               out_data[2] |= (0x20 & in_data[9])<<4;
               out_data[2] |= (0x20 & in_data[8])<<3;
               out_data[2] |= (0x20 & in_data[7])<<2;
               out_data[2] |= (0x20 & in_data[6])<<1;
               out_data[2] |= (0x20 & in_data[5]);
               out_data[2] |= (0x20 & in_data[4])>>1;
               out_data[2] |= (0x20 & in_data[3])>>2 ;
               out_data[2] |= (0x20 & in_data[2])>>3 ;
               out_data[2] |= (0x20 & in_data[1])>>4 ;
               out_data[2] |= (0x20 & in_data[0])>>5 ;                          

               out_data[3] |= (0x10 & in_data[15])<<11;            
               out_data[3] |= (0x10 & in_data[14])<<10;   
               out_data[3] |= (0x10 & in_data[13])<<9;
               out_data[3] |= (0x10 & in_data[12])<<8;
               out_data[3] |= (0x10 & in_data[11])<<7;
               out_data[3] |= (0x10 & in_data[10])<<6;
               out_data[3] |= (0x10 & in_data[9])<<5;
               out_data[3] |= (0x10 & in_data[8])<<4;
               out_data[3] |= (0x10 & in_data[7])<<3;
               out_data[3] |= (0x10 & in_data[6])<<2;
               out_data[3] |= (0x10 & in_data[5])<<1;
               out_data[3] |= (0x10 & in_data[4]);
               out_data[3] |= (0x10 & in_data[3])>>1;
               out_data[3] |= (0x10 & in_data[2])>>2;
               out_data[3] |= (0x10 & in_data[1])>>3;
               out_data[3] |= (0x10 & in_data[0])>>4;                           

               out_data[4] |= (0x08 & in_data[15])<<12;            
               out_data[4] |= (0x08 & in_data[14])<<11;   
               out_data[4] |= (0x08 & in_data[13])<<10;
               out_data[4] |= (0x08 & in_data[12])<<9;
               out_data[4] |= (0x08 & in_data[11])<<8;
               out_data[4] |= (0x08 & in_data[10])<<7;
               out_data[4] |= (0x08 & in_data[9])<<6;
               out_data[4] |= (0x08 & in_data[8])<<5;
               out_data[4] |= (0x08 & in_data[7])<<4;
               out_data[4] |= (0x08 & in_data[6])<<3;
               out_data[4] |= (0x08 & in_data[5])<<2;
               out_data[4] |= (0x08 & in_data[4])<<1;
               out_data[4] |= (0x08 & in_data[3]);
               out_data[4] |= (0x08 & in_data[2])>>1;
               out_data[4] |= (0x08 & in_data[1])>>2;
               out_data[4] |= (0x08 & in_data[0])>>3;                           

               out_data[5] |= (0x04 & in_data[15])<<13;            
               out_data[5] |= (0x04 & in_data[14])<<12;   
               out_data[5] |= (0x04 & in_data[13])<<11;
               out_data[5] |= (0x04 & in_data[12])<<10;
               out_data[5] |= (0x04 & in_data[11])<<9;
               out_data[5] |= (0x04 & in_data[10])<<8;
               out_data[5] |= (0x04 & in_data[9])<<7;
               out_data[5] |= (0x04 & in_data[8])<<6;
               out_data[5] |= (0x04 & in_data[7])<<5;
               out_data[5] |= (0x04 & in_data[6])<<4;
               out_data[5] |= (0x04 & in_data[5])<<3;
               out_data[5] |= (0x04 & in_data[4])<<2;
               out_data[5] |= (0x04 & in_data[3])<<1;
               out_data[5] |= (0x04 & in_data[2]);
               out_data[5] |= (0x04 & in_data[1])>>1;
               out_data[5] |= (0x04 & in_data[0])>>2;                           

               out_data[6] |= (0x02 & in_data[15])<<14;            
               out_data[6] |= (0x02 & in_data[14])<<13;   
               out_data[6] |= (0x02 & in_data[13])<<12;
               out_data[6] |= (0x02 & in_data[12])<<11;
               out_data[6] |= (0x02 & in_data[11])<<10;
               out_data[6] |= (0x02 & in_data[10])<<9;
               out_data[6] |= (0x02 & in_data[9])<<8;
               out_data[6] |= (0x02 & in_data[8])<<7;
               out_data[6] |= (0x02 & in_data[7])<<6;
               out_data[6] |= (0x02 & in_data[6])<<5;
               out_data[6] |= (0x02 & in_data[5])<<4;
               out_data[6] |= (0x02 & in_data[4])<<3;
               out_data[6] |= (0x02 & in_data[3])<<2;
               out_data[6] |= (0x02 & in_data[2])<<1;
               out_data[6] |= (0x02 & in_data[1]);
               out_data[6] |= (0x02 & in_data[0])>>1;                           

               out_data[7] |= (0x01 & in_data[15])<<15;
               out_data[7] |= (0x01 & in_data[14])<<14;   
               out_data[7] |= (0x01 & in_data[13])<<13;
               out_data[7] |= (0x01 & in_data[12])<<12;
               out_data[7] |= (0x01 & in_data[11])<<11;
               out_data[7] |= (0x01 & in_data[10])<<10;
               out_data[7] |= (0x01 & in_data[9])<<9;
               out_data[7] |= (0x01 & in_data[8])<<8;
               out_data[7] |= (0x01 & in_data[7])<<7;
               out_data[7] |= (0x01 & in_data[6])<<6;
               out_data[7] |= (0x01 & in_data[5])<<5;
               out_data[7] |= (0x01 & in_data[4])<<4;
               out_data[7] |= (0x01 & in_data[3])<<3;
               out_data[7] |= (0x01 & in_data[2])<<2;
               out_data[7] |= (0x01 & in_data[1])<<1;
               out_data[7] |= (0x01 & in_data[0]);                           


由于有多组这样的数据,转化时占用CPU时间比较多,看一下大家有没什么更好的算法?能压缩这个转化的时间。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
zxq6
1楼-- · 2020-01-10 03:18
用74hc595?
zhbc
2楼-- · 2020-01-10 07:53
 精彩回答 2  元偷偷看……
wshtyr
3楼-- · 2020-01-10 09:51
zhbc 发表于 2018-6-14 21:36
就是这种效果吧,明天验证一下。这段程序你是看了那个贴子,自己编出来的?那个贴子我没看到现成的完整程 ...

以前看过,大概是这个思路,那个帖子里应该有更高效的算法
wshtyr
4楼-- · 2020-01-10 14:04
zhbc 发表于 2018-6-14 21:36
就是这种效果吧,明天验证一下。这段程序你是看了那个贴子,自己编出来的?那个贴子我没看到现成的完整程 ...

另外,maxwell_lee的方法对STM32来说也是不错的,还非常好理解,两个循环就转换好了,只需要消耗大约144次Load和Store的时间
zhonghua_li
5楼-- · 2020-01-10 17:22
zhbc 发表于 2018-6-14 18:45
可以试一下,但不一定会快,这只是编译器帮着处理了一下,执行代码不一定会少。 ...

联合体,本质上,和楼主的方法一样。
pen245760036
6楼-- · 2020-01-10 22:00
可以从硬件上考虑 是否可以找一个16个引脚扩展的芯片更简单也更快稳定

一周热门 更多>