极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8245|回复: 2

请问如何通过UDP控制数字口?

[复制链接]
发表于 2012-10-17 20:18:38 | 显示全部楼层 |阅读模式
我用示例改了一个,老是不能识别控制字符

  1. #include <SPI.h>         // needed for Arduino versions later than 0018
  2. #include <Ethernet.h>
  3. #include <EthernetUdp.h>         // UDP library from: [email][email protected][/email] 12/30/2008

  4. int entpin=10;//网卡硬件开启pin
  5. int startpin=2;
  6. int scanpin=3;
  7. int MesuFpin=6;
  8. int ScanFpin=7;
  9. int ScanOpin=8;
  10. int MesuOpin=9;

  11. // Enter a MAC address and IP address for your controller below.
  12. //将MAC和IP地址发送给控制器
  13. // 将IP地址应用于本地网络 :
  14. byte mac[] = {  
  15.   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  16. IPAddress ip(192, 168,1, 11);
  17. byte gateway[] = {
  18.   192, 168, 1, 1};
  19. byte subnet[] = {
  20.   255, 255, 0, 0 };
  21. unsigned int localPort = 500;      // local port to listen on

  22. // 接收和发送数据buffers
  23. char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
  24. char  ReplyBuffer[] = "acknowledged";       // a string to send back
  25. //string stra;
  26. // An EthernetUDP instance to let us send and receive packets over UDP
  27. EthernetUDP Udp;
  28. char chr2;
  29. char chr3;
  30. char*  strin="014401M0030C";  //用来识别是否为控制字符
  31. void setup() {
  32.   //开启网路卡硬件
  33.   pinMode(entpin,OUTPUT);
  34.   digitalWrite(entpin, HIGH);
  35.   //设置接口部分
  36.   pinMode(startpin,INPUT);
  37.   pinMode(scanpin,INPUT);
  38.   pinMode(ScanOpin,OUTPUT);
  39.   pinMode(MesuOpin,OUTPUT);
  40.   pinMode(MesuFpin,OUTPUT);
  41.   pinMode(ScanFpin,OUTPUT);
  42.   digitalWrite(ScanOpin, HIGH);
  43.   digitalWrite(MesuOpin, HIGH);
  44.   digitalWrite(ScanFpin, HIGH);
  45.   digitalWrite(MesuFpin, HIGH);
  46.   // 开始 Ethernet and UDP:
  47.   // Ethernet.begin(mac,ip);
  48.   Ethernet.begin(mac, ip, gateway, subnet);
  49.   Udp.begin(localPort);
  50.   Serial.begin(9600);
  51.   chr2=2;
  52.   chr3=3;
  53. }

  54. void loop() {
  55.   // 如果数据有效,读取一个数据包
  56.   int packetSize = Udp.parsePacket();  
  57.   Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
  58.   if(packetSize)
  59.   {
  60.     for (int i =0; i < packetSize; i++)
  61.     {
  62.       strin[i]=(packetBuffer[i]);//, DEC
  63.     }

  64.     // 读取数据包如果是控制字符进行处理
  65.     boolean strok =false;
  66.     for (int i=0 ;i<packetSize;i++)
  67.     {
  68.       if (strin[i]==packetBuffer[i])
  69.       {
  70.         strok =true;
  71.       }
  72.       else
  73.       {
  74.         strok =false;
  75.       }
  76.     }     
  77.     if (strok =true)
  78.     {
  79.       Serial.println(packetSize);
  80.       Serial.println("Contents014401M0030:");
  81.       digitalWrite(MesuFpin, LOW);
  82.       Serial.println(packetBuffer);
  83.     }
  84.     // 发送字符串
  85.     Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
  86.     Udp.write("ReplyBuffer");
  87.     Udp.endPacket();
  88.   }
  89.   delay(10);
  90. }
复制代码


程序运行结果,不管是不是控制字符,结果都执行。
      Serial.println(packetSize);
      Serial.println("Contents014401M0030:");
      digitalWrite(MesuFpin, LOW);
      Serial.println(packetBuffer);
换了几种方法,都是这样,大家能否给指点一下。
我想通过特定的字符来识别控制那个数字口。
回复

使用道具 举报

 楼主| 发表于 2012-10-18 08:24:53 | 显示全部楼层
已经解决了识别控制符的情况,解决办法如下:
String strin="";
String bara ="014401M0030C";
for (int i=0;i<packetSize;i++)
  {
    strin=strin+packetBuffer[i];
  }
  if (bara==strin)
  {
   //执行代码  }

但是,为什么Udp的读取,老是延后,我发送了控制符,但是要经过
很多次的读取以后才能读到!
那位大侠能指点一下?
回复 支持 反对

使用道具 举报

发表于 2013-5-29 17:29:32 | 显示全部楼层
kekewf 发表于 2012-10-18 08:24
已经解决了识别控制符的情况,解决办法如下:
String strin="";
String bara ="014401M0030C";

我估计是由于你所发送的UDP数据包是以组播形式发出的,并没有指定目的端口及IP地址,所以读取延迟且初次读取多次才能读到数据!就是说Arduino定义了W5100的端口与IP,并未指定所要发出的数据包的目的端口号和IP地址,组播有延迟吧,我没试过,只是猜测,不太确定哈!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-29 09:25 , Processed in 0.118982 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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