github
https://github.com/HaHaHaHaHaGe/mynetstack
简介
实际上第一章的前四小节部分,已经实现了红色框框的全部功能(时间戳不在内)
接收
从最原始的数据流经过环形数组进行缓存(ringbuffer文件中的write函数)
从缓存中提取数据并尝试进行数据包提取(从ringbuffer中的read函数读取数据,经过unpacking函数)
在提取过程中进行crc32的校验(校验步骤在unpacking函数中)
将正确的数据进行译码(7bit->8bit)并分配内存进行保存(译码被封装成函数。在unpacking函数中被调用)
增加到recv_data_list单链中等待上层处理
发送
将上层提供好的数据进行编码(8bit->7bit)(trans_8to7b_64bytes_fast函数)
增加包头与crc32校验(packing函数)
增加到send_data_list单链中等待底层发送
测试代码
这个测试代码不是最后的版本,是中途测测调调测测调调的产物,所以有很多漏洞
u8 ____packing_unpackeg___(u32 loop)
{
u8 *src = basic_malloc(896);
u8 *dst = basic_malloc(2048);
u8 *l1, *l2, stop;
u32 e1, e2;
u32 i,j;
LIST_DATA *recv;
ringbuffer ring;
u32 lop2 = 100;
u32 lop3 = loop;
u32 rrr;
while (lop2--)
{
loop = lop3;
rrr = (rand() % 1024*10) + 3108 ;
initial_buffer(&ring, YES, 2072); //测试数组,即使使用rrr动态数组大小也不会有问题
while (loop--)
{
for (j = 0; j < 3; j++) //生成测试数据
{
for (i = 0; i < 896; i++)
{
src[i] = rand() % 256;
}
dst = packing(src, 896); //将原始数据进行封包
write_buffer_data(&ring, dst, 1024 + 12); //将测试数据写入环形数组
}
if (loop == 0x3d5)
i = 0;
get_unread_ptr(&ring, &l1, &l2, &e1, &e2, NO); //读取数据
stop = unpacking(l1, l2, e1, e2); //尝试解析读取的数据
recv = recv_data_list.end;
for (i = 0; i < 896; i++) //判断解析的内容与原始数据是否相同
{
if (src[i] != recv->data[i])
return NO;
}
}
recv = recv_data_list.start;
while (recv)
{
basic_free(recv->data);
Delete_List(&recv_data_list, recv);
recv = recv_data_list.start;
}
recv = send_data_list.start;
while (recv)
{
basic_free(recv->data);
Delete_List(&send_data_list, recv);
recv = send_data_list.start;
}
deinitial_buffer(&ring);
}
return YES;
}
实际测试的代码还挺多的,虽然尽力把所有可能都考虑到了,但是难免可能会有些遗漏,遇到的时候在修复把
目前来说就是这样了
结尾
代码还在更新,还是要以github为准,这几天也修复了不少的bug,也增加了些新的文件与函数,具体可看GitHub
PS:准备弄弄硬件了,先不考虑红外头了,虽然红外头便宜,但是看不到光路感觉不够酷啊哈哈
打算弄个5.5w 450nm 激光管、配上扩束镜、驱动板估计要自己做了,接收方面先考虑,滤光片和APD雪崩二极管把,到手之手难免又是一堆的测试,主要测试一些激光管的速度响应时间,和电流/电压与光强的关系把。非线性相关就麻烦了,差的不多还好,差太多可能要考虑做个非线性转线性的函数塞到里面了。关于数字调制方面有点思路了,毕竟激光的抗干扰啥的比无线电强的不是一丁半点,所以有关使用在无线通讯里的内容可能不是很适合在这个小项目了,不过还是有很大的参考价值的,就不说太多了,具体的话就放到硬件篇吧