环境:PC,PDA
开发:C#,CF
记事:
    原来PC通过USB和PDA进行连接的时候,安装ActiveSync同步工具。PC程序中调用OPENNETCF的类RAPI进行读写文件。
RAPI的使用方式很简单,因为类似Windows一样的文件路径进行操作就可以了。
    后来改用串口后,不知道使用什么方式进行同步(尝试ActiveSync配置后没有起作用)(问题1:如何同步)。所以考虑串口传输的编程方式。
    初步查找资料发现。串口传输类似SOCKET编程。System。IO。Ports定义一个SerialPort对象,就可以对串口读写。没开心多久,问题来了。当我想实现通过串口将一个文件传到PDA,是否表示,我需要在PC上写一个程序,调用时往com1写N个Bit,然后PDA也得写一个程序接收Bit,将其写到文件中(问题2:PDA如何创建文件并写Bit到文件);然而,PDA端使用应用程序的方式岂不是代表两个程序得同时运行?按Socket编程的方式,PDA端应该是编写监听程序,以服务的形式的话(问题3:PDA可以写Window服务监听吗)。后记:没有任何这方面的经验,所以一方面立贴求教,一方面记录这段时间学习的看法。见笑了。问题解决之日,散分之时。

解决方案 »

  1.   

    这个我上次也悲剧了,不了了之
    PDA和PC同步上以后PDA就有一个串口了,但是PC端还是USB,SOCKET传输找了半天没有找到方法
      

  2.   

    串口没有握手信号的,这点不同于SOCKET.串口操作就相当于文件操作。PC和PDA都要有相应的程序同时运行。
      

  3.   

    嗯嗯,sudianbo说的是。
    今天完成其他工作,开始学习这个。经过早上的资料
    http://social.msdn.microsoft.com/Forums/zh-CN/vbes/thread/ad10b043-5151-4848-bf82-dce2d346c52a
    http://topic.csdn.net/u/20110727/20/29a98cc0-8382-4293-b194-fbbf45dead09.html?78252
    两者发现:
    1.接收数据,可能导致主线程阻塞,所以使用invoke方法更新界面。
    2.DataReceived方法相应数据接收。实践过程:
    1.先下载一个虚拟串口软件。
    2.开发PC端COM程序。
    3.开发PDA端COM程序,部署时设置外置设备映射COM1。实践过程问题总结:
    1。DataReceived事件中不应该使用serialPort.Read()的方式获取数据集,因为这样会PDA阻塞等待COM口输入数据,应该判断e.EventType 是字符就取属性ReadExisting。
    2.尽管按这种写法,如果PDA获取数据操作后,PDA发送数据会导致阻塞,这个问题下午再看看。
    3.串口通信是如何保证传输数据没有丢包的呢?是自身保证还是需要代码中实现进行保证?下一阶段工作:
    1.测试串口流传输有没问题,然后实现文件传输。
      

  4.   

    修正上:
    1.DataReceived事件中是应该用ReadChar方法的。因为测试时发现PDA数据常常发送不完整。所以需要增加一个终结符来表示发送结束。因此在DataReceived事件中需要通过多次接收进行整合数据。
    2.PDA和PC传输过程中发现交叉使用发送接收两个操作导致的PDA执行WriteLine后停止的情况,解决方式是设置超时属性。个人设置为500.
    第三点还是不了解。呵呵,再说。
      

  5.   

    一般都是自己构建握手协议,和数据校验协议的。
    如果你对socket变成熟悉的话,这些应该难不住你。
    串口编程,只要串口的可以打开的,就可以向串口发送数据,
    而不管串口是连接了其他设备,这个socket(tcpip)不同,
    所以,必须要加超时和数据校验,数据重发,重发次数,等等校验。
    造成实际的通讯速率远远没有串口标称的通讯有效速率高。
      

  6.   

    自己定义了一个握手协议,可是测试发现问题很多
    你看,
    while(true)
    {
    serialPort.Write("A-B\0");
    //这里希望等待答复的时候,如果直接是read,测试的时候发现,会多次走写的步骤。
    //我估计,串口写的时候就只管写东西,并不会因为Read停下来进行Read的事情。
    //事实上,我觉得执行Read的时候,是主进程创建一个辅助线程进行DataReceved的接收事件。
    //而且debug过程发现,接收数据事件并不会响应自己定义的某信号变量(变量一直是初始值)。
    byte[] answer=new byte[10];
    serialPort.Read(answer,0,10);
    if(CheckByte(answer))break;
    }
    总之,串口通信过程中,写,读貌似不是在一个线程中完成,而是读在异步进行,导致通信过程无法控制。PS:该情况当直接运行时候貌似没有问题,当在Debug时候就有上面问题了。
    写的很乱,估计开发过的人有体验
      

  7.   

    我的伪代码如下:
    //开始通信
    //报头
    while(true)
    {
    serialPort.Write("报头信息");
    serialPort.Read("反馈信息");
    if(反馈正确)break;
    }
    //内容
    //分块
    for(文件的每一块)
    {
      while(true)
      {
      serialPort.Write("内容");
      serialPort.Read("反馈信息");
      if(反馈正确)break;
      }
    }
    这样写法遇到下面两问题:
    1。顺序执行每一块的时候,在serialPort.Write("内容")后,Read()方法偶尔会超时。
    2.成功全部执行完后,接收方的SerialPortAccept的数据接收事件中还会不停触发。
    有经验的同志帮忙啊。。
      

  8.   

    以前看过,貌似和usb一样,通讯由ms activesync负责。rapi可用。
    和以前一样,先同步,再rapi
    如果自己实现文件收发,也很容易,自己需要创建一套协议,并且考虑好协议的安全性、可恢复性、断点续传等功能。
      

  9.   

    为什么我使用虚拟串口+模拟器可以调试程序,可是使用M3设备通过串口连接到PC后,发送数据和接收数据都没有响应是为什么呢?
    应该如何调试?
      

  10.   

    为什么我使用虚拟串口+模拟器可以调试程序,可是使用M3设备通过串口连接到PC后,发送数据和接收数据都没有响应是为什么呢?
    应该如何调试?