kekewf 发表于 2012-10-17 20:18:38

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

我用示例改了一个,老是不能识别控制字符

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

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

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

// 接收和发送数据buffers
char packetBuffer; //buffer to hold incoming packet,
charReplyBuffer[] = "acknowledged";       // a string to send back
//string stra;
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
char chr2;
char chr3;
char*strin="014401M0030C";//用来识别是否为控制字符
void setup() {
//开启网路卡硬件
pinMode(entpin,OUTPUT);
digitalWrite(entpin, HIGH);
//设置接口部分
pinMode(startpin,INPUT);
pinMode(scanpin,INPUT);
pinMode(ScanOpin,OUTPUT);
pinMode(MesuOpin,OUTPUT);
pinMode(MesuFpin,OUTPUT);
pinMode(ScanFpin,OUTPUT);
digitalWrite(ScanOpin, HIGH);
digitalWrite(MesuOpin, HIGH);
digitalWrite(ScanFpin, HIGH);
digitalWrite(MesuFpin, HIGH);
// 开始 Ethernet and UDP:
// Ethernet.begin(mac,ip);
Ethernet.begin(mac, ip, gateway, subnet);
Udp.begin(localPort);
Serial.begin(9600);
chr2=2;
chr3=3;
}

void loop() {
// 如果数据有效,读取一个数据包
int packetSize = Udp.parsePacket();
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
if(packetSize)
{
    for (int i =0; i < packetSize; i++)
    {
      strin=(packetBuffer);//, DEC
    }

    // 读取数据包如果是控制字符进行处理
    boolean strok =false;
    for (int i=0 ;i<packetSize;i++)
    {
      if (strin==packetBuffer)
      {
      strok =true;
      }
      else
      {
      strok =false;
      }
    }   
    if (strok =true)
    {
      Serial.println(packetSize);
      Serial.println("Contents014401M0030:");
      digitalWrite(MesuFpin, LOW);
      Serial.println(packetBuffer);
    }
    // 发送字符串
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write("ReplyBuffer");
    Udp.endPacket();
}
delay(10);
}

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

kekewf 发表于 2012-10-18 08:24:53

已经解决了识别控制符的情况,解决办法如下:
String strin="";
String bara ="014401M0030C";
for (int i=0;i<packetSize;i++)
{
    strin=strin+packetBuffer;
}
if (bara==strin)
{
   //执行代码}

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

HKTK 发表于 2013-5-29 17:29:32

kekewf 发表于 2012-10-18 08:24 static/image/common/back.gif
已经解决了识别控制符的情况,解决办法如下:
String strin="";
String bara ="014401M0030C";


我估计是由于你所发送的UDP数据包是以组播形式发出的,并没有指定目的端口及IP地址,所以读取延迟且初次读取多次才能读到数据!就是说Arduino定义了W5100的端口与IP,并未指定所要发出的数据包的目的端口号和IP地址,组播有延迟吧,我没试过,只是猜测,不太确定哈!
页: [1]
查看完整版本: 请问如何通过UDP控制数字口?