搜索
bottom↓
回复: 14

USB虚拟串口CDC发送int数组

[复制链接]

出0入0汤圆

发表于 2012-7-11 14:20:51 | 显示全部楼层 |阅读模式
做USB--虚拟串口-CDC,在论坛参照下面链接的帖子。
http://www.amobbs.com/thread-4833268-1-1.html

我用上面的程序可以发送字符串,也可以发送u8类型的数组(0~255),我用的12位的ADC采集,存储的是int类型,也相当于2个char类型,数值范围是0~4096。

定义一个int数组先模拟....
int main(void)
{
  u16 a[4] = {2500, 3200, 4200,4095}; //int类型的数组
  Init_System();//系统初始化  
  Set_USBClock();//设置USB时钟
  USB_Interrupts_Config(); //配置USB中断
  USB_Init();//初始化USB  
while (1)
  {         
      USB_Send_Data(a, 4);  
  }


void USB_Send_Data(u16* data_buffer, u8 len)  //调用的此函数发送数组
{  
  count_in=len;  
  UserToPMABufferCopy(data_buffer, ENDP1_TXADDR, count_in);  
  SetEPTxCount(ENDP1, count_in);  
  SetEPTxValid(ENDP1);  
}


并且UserToPMABufferCopy()和SetEPTxCount()和SetEPTxValid(),这三个函数的参数定义都改成u16;
#define ENDP1   ((u8)1)改成#define ENDP1   ((u16)1);
编译还是报错?
不知是何原因,怎么设置才能发送int类型的数组呢?

出0入0汤圆

发表于 2012-7-11 14:35:51 | 显示全部楼层
你把错误信息发上来啊

出0入0汤圆

 楼主| 发表于 2012-7-11 14:53:58 | 显示全部楼层
jeames 发表于 2012-7-11 14:35
你把错误信息发上来啊

编译错误放在附件里面了,请您帮忙看下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-11 15:11:40 | 显示全部楼层
我给你贴上来吧,错误情况很明显啊

Build target 'BOOT_FLASH'
compiling hw_config.c...
..\..\source\hw_config.c(425): error:  #147-D: declaration is incompatible with "void USB_Send_Data(u8 *, u8)" (declared at line 48 of "..\..\include\hw_config.h")
..\..\source\hw_config.c:   void USB_Send_Data(u16* data_buffer, u8 len)  
..\..\source\hw_config.c:        ^
..\..\source\hw_config.c(428): error:  #167: argument of type "u16 *" is incompatible with parameter of type "u8 *"
..\..\source\hw_config.c:     UserToPMABufferCopy(data_buffer, ENDP1_TXADDR, count_in);  
..\..\source\hw_config.c:                         ^
..\..\source\hw_config.c: ..\..\source\hw_config.c: 0 warnings, 2 errors
compiling main.c...
..\..\source\main.c(60): error:  #167: argument of type "u16 *" is incompatible with parameter of type "u8 *"
..\..\source\main.c:         USB_Send_Data(a, 4);  
..\..\source\main.c:                       ^
..\..\source\main.c: ..\..\source\main.c: 0 warnings, 1 error
compiling stm32f10x_it.c...
compiling usb_desc.c...
compiling usb_istr.c...
compiling usb_prop.c...
compiling usb_pwr.c...
compiling usb_endp.c...
compiling usb_core.c...
compiling usb_init.c...
compiling usb_int.c...
compiling usb_mem.c...
..\..\..\..\library\src\usb_mem.c(35): error:  #147-D: declaration is incompatible with "void UserToPMABufferCopy(u8 *, u16, u16)" (declared at line 25 of "..\..\..\..\library\inc\usb_mem.h")
..\..\..\..\library\src\usb_mem.c:   void UserToPMABufferCopy(u16 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
..\..\..\..\library\src\usb_mem.c:        ^
..\..\..\..\library\src\usb_mem.c: ..\..\..\..\library\src\usb_mem.c: 0 warnings, 1 error
compiling usb_regs.c...
..\..\..\..\library\src\usb_regs.c(264): error:  #147-D: declaration is incompatible with "void SetEPTxValid(u8)" (declared at line 576 of "..\..\..\..\library\inc\usb_regs.h")
..\..\..\..\library\src\usb_regs.c:   void SetEPTxValid(u16 bEpNum)
..\..\..\..\library\src\usb_regs.c:        ^
..\..\..\..\library\src\usb_regs.c(513): error:  #147-D: declaration is incompatible with "void SetEPTxCount(u8, u16)" (declared at line 599 of "..\..\..\..\library\inc\usb_regs.h")
..\..\..\..\library\src\usb_regs.c:   void SetEPTxCount(u16 bEpNum, u16 wCount)
..\..\..\..\library\src\usb_regs.c:        ^
..\..\..\..\library\src\usb_regs.c: ..\..\..\..\library\src\usb_regs.c: 0 warnings, 2 errors
compiling stm32f10x_rcc.c...
compiling stm32f10x_gpio.c...
compiling stm32f10x_lib.c...
compiling stm32f10x_nvic.c...
compiling stm32f10x_flash.c...
compiling stm32f10x_usart.c...
assembling stm32f10x_vector.s...
assembling cortexm3_macro.s...
Target not created

---------------------------------------------------------------------------------------------
hw_config.c
425行
void USB_Send_Data(u16* data_buffer, u8 len)这个函数你没在头文件里改,只改了C文件的
428行也是这个问题引起的

main.c
60行
也是这个问题引起的





出0入0汤圆

 楼主| 发表于 2012-7-11 22:24:28 | 显示全部楼层
jeames 发表于 2012-7-11 15:11
我给你贴上来吧,错误情况很明显啊

Build target 'BOOT_FLASH'

还是没修改成功,我是把u16的数组取高八位和低八位,放在一个新的u8数组里,然后再传输,也可以的。明天我把源程序发给你再帮我看下,谢谢你jeames

出0入0汤圆

发表于 2012-7-11 22:59:20 | 显示全部楼层
你可以试着改成这样

int main(void)
{
  u16 a[4] = {2500, 3200, 4200,4095}; //int类型的数组
  Init_System();//系统初始化  
  Set_USBClock();//设置USB时钟
  USB_Interrupts_Config(); //配置USB中断
  USB_Init();//初始化USB  
while (1)
  {         
      USB_Send_Data((u8 *)a, 8);  
  }

出0入0汤圆

 楼主| 发表于 2012-7-12 10:13:23 | 显示全部楼层
jeames 发表于 2012-7-11 22:59
你可以试着改成这样

int main(void)

jeames 谢谢,试了,可以的。
不过存在一个小问题就是:
发送的是:
  2500  0x09c4
3200  0x0c80
4200  0x1068
4095  0x0fff
【09 c4 0c 80 10 68 0f ff】

串口与调试助手接收的是:
【c4 09 80 0c  68 10  ff 0f】
也就是接收的高八位和低八位反过来了

1、怎么就反过来了,存数据是从低地址开始存,取数据难道也是从低地址开始取数据吗?所以导致低位在前高位在后。

2、你好,jeames ,这个USB虚拟串口是用那个库写的,我现在另外一个ADC程序是3.0的库,不知能不能融合在一起?需要改动那些?


顺便交流一下是这样把1个u16拆成2个u8的:
代码如下:
   u8 i,j;
   u16 b[]={256,512,1024,2048,4095}; //u16 int类型数据
   u8 a[10];//开辟一个2倍的sizeof(b)空间
   for(i=0,j=0;i<5;i++,j++)
   {
   
     a[j++]=b>>8; //取高八位
     a[j]=(u8)b;    //取低八位
   }


   主函数里
while (1)
  {       
   USB_Send_Data(a,10);
  }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-12 10:37:44 | 显示全部楼层
其实M3芯片就是这样存储数据的,低位在先,和我们的PC机是一样的,

你可以在上位机来处理你收到的数据啊,收到后将两个字节调换一下

出0入0汤圆

 楼主| 发表于 2012-7-12 11:26:26 | 显示全部楼层
jeames 发表于 2012-7-12 10:37
其实M3芯片就是这样存储数据的,低位在先,和我们的PC机是一样的,

你可以在上位机来处理你收到的数据啊, ...

我看了下usb_mem.c里函数

怀疑是这个地方将高低八位顺序调整:
void UserToPMABufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
{
  u32 n = (wNBytes + 1) >> 1;   /* n = (wNBytes + 1) / 2 */
  u32 i, temp1, temp2;
  u16 *pdwVal;
  pdwVal = (u16 *)(wPMABufAddr * 2 + PMAAddr);
  for (i = n; i != 0; i--)
  {
    temp1 = (u16) * pbUsrBuf;
    pbUsrBuf++;
   temp2 = temp1 | (u16) * pbUsrBuf<< 8 ;
    *pdwVal++ = temp2;
    pdwVal++;
    pbUsrBuf++;
  }
}

然后将上面标红的改成:temp2 = temp1 << 8| (u16) * pbUsrBuf ;
然后,就奇怪了,电脑不能识别STM 的虚拟串口,还弹出一个窗口?
程序内的一条语句竟然威力这么大!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-12 11:52:51 | 显示全部楼层

呵呵,这个不是这样的,这是由于M3的16位数据访问的优化,所以使用U16处理Buf里的数据,效率比较高,

如果你改了 UserToPMABufferCopy这个函数,

那你还有连带修改的数据比较多呢,

所有的USB描述符数据通通改一下,呵呵

这就是你改了代码,设备就不识别的原因

出0入0汤圆

发表于 2012-7-12 11:54:08 | 显示全部楼层
你还是改一下你的缓冲区数据格式吧

出0入0汤圆

 楼主| 发表于 2012-7-12 20:17:59 | 显示全部楼层
jeames 发表于 2012-7-12 11:54
你还是改一下你的缓冲区数据格式吧

缓冲区数据格式,怎么改呢?刚上手这块不懂

出0入0汤圆

发表于 2012-7-12 20:28:07 | 显示全部楼层
USB传送的数据都是基于字节型的,所以如何组织数据是应用的事情

要不然,你把采集的U16格式的数据按照高位在先的数据格式放在U8*格式的缓冲区里,

进行发送,发送的长度是采集数据的两倍,(即字节长度)

要不,由上层代码(即PC机驱动)完成这个任务,收到数据后,进行变换(两个字节高低换位)

出0入0汤圆

 楼主| 发表于 2012-7-12 22:08:08 | 显示全部楼层
jeames谢谢,结贴。

出0入0汤圆

 楼主| 发表于 2012-7-12 22:09:35 | 显示全部楼层
jeames 发表于 2012-7-12 20:28
USB传送的数据都是基于字节型的,所以如何组织数据是应用的事情

要不然,你把采集的U16格式的数据按照高位 ...

jeames谢谢你,结贴~~有问题我再新开帖子,欢迎指导。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 22:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表