跑通例程ad_saver
目前的配置
FPGA 端:
写时钟200K,读时钟与主频时钟相同,24M 占比50%
fifo的写使能,原来设置的写递增数时默认是1 ,AD采集时另一个,改成写递增数时与写递增数的写使能保持一致,AD采集时不变,这样,在模拟数据时,数据一产生就开始往里写,
具体的流程如下
在FPGA输出端采用chipscope抓取到的数是正确的 ,隔一段时间读取一组数,从1-256开始,一组一组递增
ARM端数据保存后采用scp指令上传 在MATLAB读出来是正常递增数 int16的时候是正常数值,int32时能看到递增走势,但是数据是位数变换过的
(测试换成其他规律的数在FPGA端写入也能正常读出)
在ad_saver基础上配置TCP/IP
只配置TCP之后可以正常运行,无报错
尝试:添加测试数组 分别采用数组逐个赋值和memcpy的形式,进行对比
代码如下:
/* create test array to show data */
char tst1[SR_BUFFER_SIZE];
char tst2[SR_BUFFER_SIZE];
char k =0;
for(k=0;k<50;k++)
{
tst1[k] = *(data+k);
printf("now count is %d and tst1[%d]= %x\n",count,k,tst1[k]);
}
memcpy(tst2,data,50);
char m=0;
for(m=0;m<50;m++)
{
printf("now count is %d and tst2[%d]= %x\n",count,m,tst2[m]);
}
发现一,对于tst1,不管tst1和计数k使用int还是char,结果打印出来都是一样的数,但不明确是几位的
tst2 因为使用的memcpy是属于按字节计数的内存拷贝,所以出来的结果是8位一读 0010 0020 0030…
结果:
为了看清楚具体的位数,对FPGA端的数据进行改变,
对比之后发现逐个赋值存在丢数行为,memcpy表达正确
所以,放弃逐个赋值给数组的情况,这个错误的原因猜想是LINUX和Windows一个是32位机一个是64位的原因,还是uint16_t *data? 不去确诊了,放弃这种办法,采用memcpy 内存拷贝
发现二 ,逐个打印时,count计数,发现不管是tst1还是tst2 ,当count为2时,数组显示均为0值,除count为2 ,其他每组count对应的值都是重复的
1.会不会是memcpy数目太少,增加拷贝数目到300,不改变打印的数组值
/media/addtcp/tx1
/* create test array to show data */
char tst[SR_BUFFER_SIZE];
memcpy(tst,data,300);
char m=0;
for(m=0;m<50;m++)
{
printf("now count is %d and tst2[%d]= %x\n",count,m,tst2[m]);
}
结果没有变化
2. 先放弃,观察一下数组整体的正确率 把数组扩大到SR_BUFFER_SIZE
char tst[SR_BUFFER_SIZE];
memcpy(tst,data,SR_BUFFER_SIZE);
char m=0;
for(m=0;m<SR_BUFFER_SIZE;m++)
{
printf("now count is %d tst[%d] = %x\n",count,m,tst[m]);
}
打印结果,循环tst[0-255] 结果从0 0 1 0 -------0 0 40 0(十进制的64)
SR_BUFFER_SIZE = 256? 错误
调整大小
char tst[4096];
memcpy(tst,data,512);
char m=0;
for(m=0;m<512;m++)
{
printf("now count is %d tst[%d] = %x\n",count,m,tst[m]);
}
还是不对,打印到256,
因为char m , 试过改成uint16,证实确实与m有关,改大点,改成long m=0; 同时打印的数据也增大,
改大点 写入的数是32位的1-2048。2048*8=16384 所以16384可以打印一组循环,改数组大小,如下
/media/addtcp/tx2
/* create test array to show data */
char tst[16392];
memcpy(tst,data,16392);
uint16_t m=0;
for(m=0;m<16392;m++)
{
printf("now count is %d tst[%d] = %x\n",count,m,tst[m]);
}
可以打印出结果,从 0 0 1 0 打印到 0 0 0 8(2048),再 0 0 1 0
但是不确定这个后面的这个0010是之前的数循环打印,还是新的数,在FPGA端更改数值,1-2048后跳转到 15++
在matlab端也有体现
这是第一组数,后面其他的都是打开2048-----15------ 2048----15 证明数据在不断更新
至此,LINUX存档为 home/addtcp/addtcpconfig
加入TCP传输
取消打印tst数据的部分
加入TCPserver程序
/media/addtcp/tx3
while (1) {
bzero(send_buf, sizeof(send_buf));
//char *str = fgets(send_buf, sizeof(send_buf), stdin);
char *str = memcpy(send_buf,tst,sizeof(send_buf));
if (str == NULL) {
perror("fgets");
goto err;
}
if (send(conn_fd, send_buf, strlen(send_buf) - 1, 0) < 0) {
perror("send");
goto err;
}
}
出现的结果是,MATLAB读到的数据
但是存在问题,传输的数据,按偶数来读的话,读到1-256递增,257开始出现乱码跳变
修改TCP传输的BUFFER_SIZE 4096
可以传输到1024 ,之后为0有八百多位,然后乱码,证实与TCP设置的传输大小有关
测试打印程序中各个宏定义的数值大小:
LOG_DEBUG("just for test SR_BUFFER_SIZE = %d\n",SR_BUFFER_SIZE);
LOG_DEBUG("just for test node->SR_buffer = %d\n",node->SR_buffer);
LOG_DEBUG("just for test node->size = %d\n",node->size);
结果如下:
所以,试着讲传递的所有大小都改成1024*2048的大小,保证一次传一组,没有丢失
ARM端
/media/addtcp/tx4
#define BUFFER_SIZE 1024*2048 // buf size
取消ARM端打印send_buf 的值
MATLAB端,创建连续数组读取数值
clear all
fclose all;
t = tcpip('192.168.1.5',9090)
t.timeout = 30;
t.inputBufferSize =36000;
t.outputBufferSize=36000;
t.byteorder='littleEndian';
fopen(t);
fwrite(t,'hello');
for i=1:1000
a{i}= fread(t,2048,'uint16');
end
fclose(t);
结果:
一共接收到512个数组存数,每个数组存2048个16位的数
计算 5122048uint16 = 102420488
也就是说只读取了一组2M的8位数
打印出来的结果如下:
MATLAB端显示还有数据没有读完
修改MATLLAB端的读数据大小
a{512}正常,a{512}的第2048位是265,
a{513}-a{1023}为0,
a{1024}乱码,a{1025}从第140位是1开始正常递增到2048后从10 开始递增
a{1537}正常递增到第138位是265之后为0
(换数,还是这几组数相应的位置开始突变)
更改MATLAB端读取的数组大小
改到数组a到3000
前面的变化一样
a{1537}正常递增到第138位是265之后为0
a{2048}乱码 ,a{2049}的第278位是1开始递增 然后递增到2048之后又从10开始递增
a{2561}递增到第276位是265之后为0
说明只能读一组数据 5122048 int_16 == 10242048char_8 然后停一组数时间空着,继续重复读数
问题修改:修改ARM端循环
/media/addtcp/tx5/
while(!quit){
count++;
pid>0 (send){
bzero send_buf
|
wait data
|
get data node
|
get upp data
|
send data
|
make free list/node again
}
pid=0 (receive)
}
/media/addtcp/tx6: 把循环改到tcp内部
pid>0 (send){
while(!quit){
bzero send_buf
|
wait data
|
get data node
|
get upp data
|
send data
|
make free list/node again
}
}
pid=0(receive)
/media/addtcp/tx6.1: 在tx6的框架下改成count%2
更改为两个BUFFER轮流读写
方法一:在同一个循环下,轮流用两个buffer,采用num
写入部分: if num =0, buf1 <—data,num+1;
else buf2 <—data, num-1;
读出部分: if num =1,send_buf<—buf2
else send_buf <—buf1
结果:只读一次,结果为0 ,读的最初的buf2的默认值0
方法二,采用总体的一次一个buf
count 计数 count为偶数,和count为奇数
/media/addtcp/tx8
测试轮换之后的send_buf,暂时不接入TCP
if(count%2==0){
bzero(buffer1,SR_BUFFER_SIZE);
memcpy(buffer1, data, SR_BUFFER_SIZE);
LOG_DEBUG("memcpy data to buffer1 ");
}
else{
bzero(buffer2,SR_BUFFER_SIZE);
memcpy(buffer2, data, SR_BUFFER_SIZE);
LOG_DEBUG("memcpy data to buffer2");
}
if (count%2==0)
{
memcpy(send_buf, buffer2, SR_BUFFER_SIZE); // buffer1 busy
LOG_DEBUG("scp buf2 to send ");
}
else
{
memcpy(send_buf, buffer1, SR_BUFFER_SIZE); // buffer2 busy
LOG_DEBUG("scp buf1 to send ");
}
int k = 0;
for(k=0;k<16;k++){
printf("send_buf[%d] == %x\n ",k,send_buf[k]);
}
测试结果如下:
当FPGA端输入1-2048,10-2048,10-2048这种循环时
send_buf 的打印信息是,
可以看到send_buf接收到的是不断变化的数据,
试过如果FPGA换成一直1-2048递增,打印出来的结果
自count=4起一直是和count=2一样的打印结果,表明send_buf接收的数据正确
/media/addtcp/tx8.1
把send_buf 接入到TCP 中
pid = fork();
if (pid > 0) {
while (1) {
if (send(conn_fd, send_buf, strlen(send_buf) - 1, 0) < 0) {
perror("send");
goto err;
}
}
结果,直接结束进程
尝试 memcpy一个测试数组,用来中转一下send_buf
/media/addtcp/tx8.2 一样的报错
/media/addtcp/tx9
直接按照count的奇偶标准,直接给tcp
更改,在tcp端 只传输一个buffer给matlab
结果:每次运行count都只显示一个count=2; 正常是指从1-2018,10-2048一组数
buffer2 运行结果:
0-------a{513}正常---------a{1025}乱码-0---------a{1537}的140位开始正常------a{2049}乱码- 0----------a{2561}的278位正常-----------
buffer1 运行结果:
正常-----a{513}乱码到第435位正常----------a{1025}乱码后第870位正常------a{1537}的868位(265)乱码—1034位正常--------a{2049}的1302位(265)乱码----1738位正常-------
说明只有一组数在循环传递,并且有规律的出现乱码
最终例程 tx6.3
将tx6.3 去掉测试打印的数据显示之后,移入mytest的all_addtcp/addtcplastok,即完成上传数据链路的所有, 所有例程均保存在mytest/all_addtcp中
接下来的例程全部在my_test/add_tcp_uart,