搜索
bottom↓
回复: 1

求助,谁同时懂C#和C++,想把一段程序用C实现,有些细节...

[复制链接]

出0入0汤圆

发表于 2013-9-7 16:03:34 | 显示全部楼层 |阅读模式
本帖最后由 inkfish321 于 2013-9-7 16:07 编辑

正在写一个BLE的上位机程序,但是NORDIC所给的例子只有C#,和DLL。提供C++的接口,但是没头文件。只有API的说明文档。

C#的部分代码如下:

  1. using System;
  2. using Nordicsemi;

  3. namespace nRFUart
  4. {
  5.     internal class PipeSetup
  6.     {
  7.         /* Public properties for accessing discovered pipe IDs */
  8.         public int UartRxPipe { get; private set; }
  9.         public int UartTxPipe { get; private set; }

  10.         MasterEmulator masterEmulator;

  11.         public PipeSetup(MasterEmulator master)
  12.         {
  13.             masterEmulator = master;
  14.         }

  15.         /// <summary>
  16.         /// Pipe setup is performed by sequentially adding services, characteristics and
  17.         /// descriptors. Pipes can be added to the characteristics and descriptors one wants
  18.         /// to have access to from the application during runtime. A pipe assignment must
  19.         /// be stated directly after the characteristic or descriptor it shall apply for.
  20.         /// The pipe type chosen will affect what operations can be performed on the pipe
  21.         /// at runtime. <see cref="Nordicsemi.PipeType"/>.
  22.         /// </summary>
  23.         ///
  24.         public void PerformPipeSetup()
  25.         {
  26.             /* GAP service */
  27.             BtUuid uartOverBtleUuid = new BtUuid("6e400001b5a3f393e0a9e50e24dcca9e");
  28.             masterEmulator.SetupAddService(uartOverBtleUuid, PipeStore.Remote);

  29.             /* UART RX characteristic (RX from peripheral's viewpoint) */
  30.             BtUuid uartRxUuid = new BtUuid("6e400002b5a3f393e0a9e50e24dcca9e");
  31.             int uartRxMaxLength = 20;
  32.             byte[] uartRxData = null;
  33.             masterEmulator.SetupAddCharacteristicDefinition(uartRxUuid, uartRxMaxLength,
  34.                 uartRxData);
  35.             /* Using pipe type Transmit to enable write operations */
  36.             UartRxPipe = masterEmulator.SetupAssignPipe(PipeType.Transmit);

  37.             /* UART TX characteristic (TX from peripheral's viewpoint) */
  38.             BtUuid UartTxUuid = new BtUuid("6e400003b5a3f393e0a9e50e24dcca9e");
  39.             int uartTxMaxLength = 20;
  40.             byte[] uartTxData = null;
  41.             masterEmulator.SetupAddCharacteristicDefinition(UartTxUuid, uartTxMaxLength,
  42.                 uartTxData);
  43.             /* Using pipe type Receive to enable notify operations */
  44.             UartTxPipe = masterEmulator.SetupAssignPipe(PipeType.Receive);
  45.         }
  46.     }
  47. }

复制代码
我想用C来实现,这是我改的代码:

  1. #define NRF_UART_RX_BUF_LENGTH 20
  2. #define NRF_UART_TX_BUF_LENGTH 20

  3. typedef struct _PedoNrfUartIo{
  4. //public:
  5.     PedoIoTypeDef supper;
  6.     void (*StopScanning)(void *me);
  7. //private:
  8.     uint8_t mPackHeadFlag1;
  9.     uint8_t mPackHeadFlag2;
  10.     uint32_t mReceiveCount;
  11.     uint32_t mSendCount;
  12.     uint32_t mBusy;
  13.     uint8_t mUartRxData[NRF_UART_RX_BUF_LENGTH];
  14.     uint8_t mUartTxData[NRF_UART_TX_BUF_LENGTH];
  15.     int32_t UartRxPipe;
  16.     int32_t UartTxPipe;
  17.     HINSTANCE hMasterEmulatorDll;
  18.     MasterEmulator *pMasterEmulator;
  19.     BtUuid *pUartOverBtleUuid;
  20.     BtUuid *pUartRxUuid;
  21.     BtUuid *pUartTxUuid;
  22. }PedoNrfUartIoTypeDef;



  23. PedoIoTypeDef* CreateNrfUartIo(void);



  24. static void ClosePedoNrfUart(void *me)
  25. {
  26.     PedoNrfUartIoTypeDef *this = (PedoNrfUartIoTypeDef *)me;
  27.    
  28.     if(this == NULL)
  29.         return;

  30.     if(this->hMasterEmulatorDll != INVALID_HANDLE_VALUE)
  31.     {
  32.         AfxFreeLibrary(this->hMasterEmulatorDll);
  33.     }
  34.         if(this->pMasterEmulator != NULL)
  35.         {
  36.                 delete(this->pMasterEmulator);
  37.         }
  38.     free(this);
  39. }


  40. PedoIoTypeDef* CreateNrfUartIo(void)
  41. {
  42.     PedoNrfUartIoTypeDef *NrfUartIo = (PedoNrfUartIoTypeDef *)malloc(sizeof(PedoNrfUartIoTypeDef));
  43.     PedoIoTypeDef *supper = (PedoIoTypeDef *)NrfUartIo;
  44.    
  45.     if(supper != NULL)
  46.     {
  47.         memset(NrfUartIo, 0, sizeof(PedoNrfUartIoTypeDef));
  48.         supper->GetIoType = &NrfUartGetIoType;
  49.         supper->GetPackHeadFlag = &NrfUartGetPackHeadFlag;
  50.         supper->UpdateIoState = &NrfUartUpdateIoState;
  51.         supper->CloseIo = &ClosePedoNrfUart;
  52.         supper->ReadPack = &NrfUartReadPack;
  53.         supper->SendPack = &NrfUartSendPack;
  54.         NrfUartIo->hMasterEmulatorDll = AfxLoadLibrary(_T("MasterEmulator.dll"));
  55.         //打开USB设备
  56.     }
  57.         else
  58.         {
  59.                 return NULL;
  60.         }
  61.         if(this->hMasterEmulatorDll != INVALID_HANDLE_VALUE)
  62.         {
  63.                 NrfUartIo->pMasterEmulator = new MasterEmulator();
  64.                 NrfUartIo->pUartOverBtleUuid = new BtUuid("6e400001b5a3f393e0a9e50e24dcca9e");
  65.                 NrfUartIo->pUartRxUuid = new BtUuid("6e400002b5a3f393e0a9e50e24dcca9e");
  66.                 NrfUartIo->pUartTxUuid = new BtUuid("6e400003b5a3f393e0a9e50e24dcca9e");
  67.         }
  68.         else
  69.         {
  70.                 supper->CloseIo();
  71.                 return NULL;
  72.         }
  73.        
  74.         if((NrfUartIo->pMasterEmulator != NULL) &&
  75.                 (NrfUartIo->pUartOverBtleUuid != NULL)&&
  76.                 (NrfUartIo->pUartRxUuid != NULL)&&
  77.                 (NrfUartIo->pUartTxUuid != NULL))
  78.         {
  79.             MasterEmulator *pMasterEmulator = NrfUartIo->pMasterEmulator;
  80.             /* GAP service */
  81.                 pMasterEmulator->SetupAddService(*NrfUartIo->pUartOverBtleUuid, PipeStore.Remote);

  82.                 /* UART RX characteristic (RX from peripheral's viewpoint) */
  83.                 pMasterEmulator->SetupAddCharacteristicDefinition(NrfUartIo->pUartRxUuid ,
  84.                                                                   NRF_UART_RX_BUF_LENGTH,
  85.                                                                   NrfUartIo->mUartRxData);
  86.                 /* Using pipe type Transmit to enable write operations */
  87.                 NrfUartIo->UartRxPipe = pMasterEmulator->SetupAssignPipe(PipeType.Transmit);

  88.                 /* UART TX characteristic (TX from peripheral's viewpoint) */
  89.                 pMasterEmulator->SetupAddCharacteristicDefinition(*NrfUartIo->pUartTxUuid,
  90.                                                                   NRF_UART_TX_BUF_LENGTH,
  91.                                                                   NrfUartIo->mUartTxData);
  92.                
  93.                 /* Using pipe type Receive to enable notify operations */
  94.                 NrfUartIo->UartTxPipe = pMasterEmulator->SetupAssignPipe(PipeType.Receive);
  95.         }
  96.         else
  97.         {
  98.                 supper->CloseIo();
  99.                 return NULL;
  100.         }

  101.     return supper;
  102. }

复制代码
但是有很多问题不懂。例如用C++ NEW出来的类是不是该用类指针来代替。
另外看一下文档里提供的函数对照如下:

  1. C#
  2. public void SetupAddCharacteristicDefinition(
  3.         BtUuid characteristicUuid,
  4.         int maxDataLength,
  5.         byte[] data
  6. )

  7. Visual C++
  8. public:
  9. void SetupAddCharacteristicDefinition(
  10.         BtUuid^ characteristicUuid,
  11.         int maxDataLength,
  12.         array<unsigned char>^ data
  13. )

  14. C#
  15. public void SetupAddService(
  16.         BtUuid serviceUuid,
  17.         PipeStore pipeStore
  18. )

  19. Visual C++
  20. public:
  21. void SetupAddService(
  22.         BtUuid^ serviceUuid,
  23.         PipeStore pipeStore
  24. )

  25. C#
  26. public Collection<string> EnumerateUsb(
  27.         UsbDeviceType deviceType
  28. )

  29. Visual C++
  30. public:
  31. Collection<String^>^ EnumerateUsb(
  32.         UsbDeviceType deviceType
  33. )


复制代码
BtUuid^  这个是什么意思?
Collection<String^>^  这个又是什么意思?

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入442汤圆

发表于 2013-9-7 16:31:17 | 显示全部楼层
还用C++ CLR编程?太费事了吧。除非它DLL是CLR的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-3 02:13

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

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