极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 37576|回复: 15

求大神幫解~急

[复制链接]
发表于 2016-5-30 15:10:35 | 显示全部楼层 |阅读模式
本帖最后由 s930427 于 2016-5-30 15:11 编辑

目前要用arduino經由tx rx傳送封包,按照封包格式傳送,單接收結果為完全不同,求大神幫忙

圖為封包格式


希望與此圖上半部一樣的訊號,但是ARDINO卻是下半部的那樣。



  1. /* program design by Edy TSAI  */
  2. /* KEB company
  3.   /* NOTE 使用 Serail.print  表示 寫入 ; 先選通道 為 Serial 或是Serial1-3,  print(這裡放value,格式 (ex: bin or hex ))   */

  4. #include <UTFT.h>
  5. #include <Wire.h>
  6. UTFT          myGLCD(HX8357B, 38, 39, 40, 41);

  7. extern uint8_t BigFont[];
  8. extern uint8_t SmallFont[];
  9. char buf[4];
  10. byte R;
  11. byte A[13];

  12. void setup() {
  13.   myGLCD.InitLCD();
  14.   myGLCD.clrScr();
  15.   myGLCD.setFont(BigFont);
  16.   myGLCD.setColor(255, 255, 255); //BLACK

  17.   Serial.begin(38400);
  18.   //Serial.begin(4800, SERIAL_7E1);
  19.   Serial3.begin(38400);
  20.   Wire.begin();
  21.   //Serial3.begin(38400, SERIAL_7E1);
  22. }

  23. void loop() {
  24.   // Serial.print(48, HEX);
  25.   myGLCD.print("R & W", CENTER, CENTER);
  26.   //READp();
  27.   writep();
  28.   //Serial.end();
  29.   //Serial3.end();

  30. }

  31. void serial()
  32. {
  33.   R = Serial.available();
  34.   myGLCD.printNumI(R , 0, 0);

  35.   if (Serial.available())
  36.   {
  37.     Serial.readBytes(A, 13);

  38.     if (A[0] == 48) {
  39.       Serial.println("LOGIN ACESS !");//  密碼 0009 回傳 ,9 IN ASII =57
  40.     }

  41.     for (int i = 0; i < 13; i++)
  42.     {
  43.       Serial.print(A[i]  ); // 回傳給 serial 收到的資料
  44.       Serial3.print(A[i]); // 並傳到 serial 3
  45.       myGLCD.print("SERIAL READ ", 50, 0);
  46.       myGLCD.printNumI(A[i] , i * 35, 30);
  47.       delay(100);
  48.     }
  49.   }



  50. }
  51. ////////////////////////////////////////////////////////////////////////////////////

  52. void READp()
  53. {
  54.   //   EOT = 04h ENQ = 05h STX = 02h ETX = 03h ACK = 06h NAK = 15h
  55.   //                  48, 44, 30, 33, 30, 33, 30, 30, 05, 29   測試用 封包 16進制
  56.   //byte request[10] = {48, 44, 30, 33, 30, 33, 30, 30, 05, 29};
  57.   byte request[10] = {72, 68, 48, 51, 48, 51, 48, 48, 05, 41}; //宣告 request 封包 大小為 10 bytes  請注意 輸入 真值
  58.   Serial3.write(request, 10); // send request  through Serial3  note write send binary data to serial port


  59.   byte Response[13];
  60.   Serial3.readBytes(Response, 13);

  61.   for (int j = 0; j < 13; j++) {
  62.     myGLCD.printNumI(Response[j], 0, j * 20);
  63.     //myGLCD.print(itoa(Response[j], buf, 16) , 50, j *20);
  64.   }

  65. }

  66. //////////////////////////////////////////////////////////////////
  67. void writep()
  68. {
  69.   /*                           _____________________________________________________________
  70.    *  封包格式       EOT  01   | STX | H/G |  IID | address |   data 8  |  SET | ETX | BCC  |
  71.                                | 02h | 'H' | '2'  | 4byte   |   8byte   |'0''1'| 03h | >1Fh |
  72.   */
  73.   //                 |     |       |   STX  |   |  |                |                              |       |       |   |
  74.   byte wrequest[27]={30, 34, 30, 31, 30, 32, 34,38, 32, 30, 31, 32, 34, 33, 17, 17, 17, 17, 17, 17, 17, 31, 17, 17, 17, 33, 45}; //HEX
  75.   //byte wrequest[] = {0x04, '0', '1', 0x02, 'H', '4', '0', '1', '2', 'C', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', 0x03, 0x28};
  76.   //byte wrequest[23]={04, 48, 49, 50, 72, 54, 48, 49, 50, 67, 48, 48, 48, 48, 48, 48, 48, 49, 48, 48, 48, 03, 35};  //DEC Warr
  77.   
  78.   //Serial3.write(wrequest, 19); // send request  through Serial3  note write send binary data to serial port
  79.   for (int a = 0; a < 27; a++)
  80.   {
  81.     sendbyte(wrequest[a]);
  82.    
  83.     //delay(2/10);
  84.   }
  85.   
  86.   //Serial.write(ss);
  87.   delay(1000);
  88.   
  89.   Serial.write(wrequest, 27);
  90.   // delay(50);

  91.   //Serial3.write(0);     // 回傳ERROR  封包 為 80 (HEX)
  92.   //Serial3.write(1);     // 不回傳 不顯示
  93.   //byte A[2]={1,0};
  94.   //={0,0};    //0  ! ReceiveError  BCC    RAW 回傳ERROR  封包 為 80 (HEX)
  95.   //Serial3.write(A,2);
  96.   //Serial3.print(0);  //70   //  key 0 get 40 回應 /key 1 | 2  no response  key 00 顯示 1f 回應 40
  97.   //Serial3.print(1);  //7C


  98.   //byte wrequest2[2]={1,1};
  99.   //Serial3.write(wrequest,19);
  100.   //Serial.write(wrequest,19);   // arduino
  101.   //Serial3.print(1);

  102.   for (int j = 0; j < 14; j++) {
  103.     myGLCD.printNumI(wrequest[j] , j * 35, 0);
  104.     myGLCD.print(itoa(wrequest[j], buf, 16) , j * 35, 20);
  105.   }
  106. }

  107. /* below is result at protocol monitor
  108.   0    6F 1F 19 1F 19 1F 1F 1F 1F 1F 1F 1F 1F 1F 79 0F   oy
  109.   1   76 6F 1F 19 1F 19 1F 1F 1F 1F 1F 1F 1F 1F 1F 79 0F  voy

  110.   Serial.begin() - 開啟 Serial Port 並設定通訊速率 (baud rate)
  111.   Serial.println() - 傳送資料到外部電腦
  112.   Serial.read() - 接收來自外部電腦的資料
  113.   Serial.available() - 取得 Serial Port 可讀取的資料位元組數目 (number of bytes),如果 Serial port 有資料進來,Serial.available() 會回傳大於 0 的數值。
  114.   Serial.read() - 讀取進來的第一個位元組 (first incoming byte)。

  115. */
  116. /*//仿c的printf
  117.   /*void pf(const char *fmt, ... ){
  118.     char tmp[128]; // resulting string limited to 128 chars
  119.     va_list args;
  120.     va_start (args, fmt );
  121.     vsnprintf(tmp, 128, fmt, args);
  122.     va_end (args);
  123.     Serial.print(tmp);
  124.   }*/
  125. void sendbyte(char val)
  126. {
  127.   Serial.print(val);
  128.   delay(1/10);
  129. }
  130. void sendstring(char *val)
  131. {
  132.   while (*val != '\0')
  133.   {

  134.     sendbyte(*val++);
  135.   }
  136. }










复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2016-5-30 16:28:51 | 显示全部楼层
咁長無認真睇, 只係見到 sendbyte 入面果句, 應該好大問題:
Serial.print(val);

做呢類通訊, 一定係用 write, 唔會用 print.
回复 支持 反对

使用道具 举报

发表于 2016-5-30 16:30:31 | 显示全部楼层
Sorry, 你又好似係用
Serial.write(wrequest, 27);

睇漏左....
真係太長, 仲好多 comment, 好難睇.
回复 支持 反对

使用道具 举报

发表于 2016-5-30 16:41:06 | 显示全部楼层
"按照封包格式傳送,單接收結果為完全不同"
或者會唔會講清楚, 你話有問題既, 係發出既資料定係回傳既資料?
程式之中只可以猜想發出的資料, 如果問題是回傳的資料, 在 程式中不能看到吧.

另外, 當中一句: delay(1/10);
delay 的 parameter 是 unsinged long, 是整數值的, 1/10 就變成 0 了.  如果想 delay 0.1 ms, 要用 delayMicroseconds(100)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-30 17:30:20 | 显示全部楼层
Super169 发表于 2016-5-30 16:41
"按照封包格式傳送,單接收結果為完全不同"
或者會唔會講清楚, 你話有問題既, 係發出既資料定係回傳既資料 ...

抱歉,是我沒打清楚,
我讓封包發出去,另外在用軟體監測送出去的封包。
問題是我發出去的封包,用監測軟體查看時,卻有問題!
回复 支持 反对

使用道具 举报

发表于 2016-5-30 18:08:12 | 显示全部楼层
嘗試粗略跟你的程式行一次,

loop()->writep()->sendbyte()->Serial.print
在 writep 中把 wrequest 的資料一個個送出.

初時無留意, 你係用 char 去 print, arduino 入面 print(char c) 係直接 call 番 write(c);
所以呢度用 print 都唔應該有問題.

而你之後就係  Serial.write(wrequest, 27);
應該係同上面一樣, 跟 wrequest 既 27 個 bytes 送出.

你講有問題既, 係邊個 output 有問題.  
你收到 00 F8 F8 F8 80 .... ?
回复 支持 反对

使用道具 举报

发表于 2016-5-30 18:09:54 | 显示全部楼层
或者可以先測試一下連線, 做個最簡單的程式, 只在 setup 中 送出幾個 Serial.write, 看看接收是否正確.
如果這樣也不正確, 就可能是 serial 連線的設定上有問題了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-30 21:14:43 来自手机 | 显示全部楼层
Super169 发表于 2016-5-30 18:08
嘗試粗略跟你的程式行一次,

loop()->writep()->sendbyte()->Serial.print


是的,的確會收到00 F8
是型態問題嗎?
試過用print(v,HEX);
也是不得解。
回复 支持 反对

使用道具 举报

发表于 2016-5-30 22:33:29 | 显示全部楼层
你的程式中:
byte wrequest[27]={30, 34, 30, 31, 30, 32, 34,38, 32, 30, 31, 32, 34, 33, 17, 17, 17, 17, 17, 17, 17, 31, 17, 17, 17, 33, 45}; //HEX

這樣只會設定成 dec 而唔係 hex.

理論上應該會發出  1E 22 1E 1F .....
就算用左 print, 當 int 出, 你都應該係收到 33 30 33 34 .....

你接收到既比較奇怪.  所以有點懷疑係連線上既設定有問題.

你先試試不用你的 program, 簡單在 setup 入面, Serial.begin  之後,  只加上 Serial.write(0x30); 就完結.
看看是否可以收到 30.

通訊程式要除蟲時, 第一件事必要確保通訊本身是沒有問題, 否則, 接收到的東西就不可靠了.

回复 支持 反对

使用道具 举报

发表于 2016-5-30 22:36:09 | 显示全部楼层
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-30 23:50:48 | 显示全部楼层
Super169 发表于 2016-5-30 22:36
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.

34800bps是相同設定,至於發送是dec,hex都有試過,卻還是有問題

另外則是一直覺得是監測封包軟體的關西,因為這程式是要模仿上半部的那種訊號,但卻一直有問題

感謝您回復。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-31 08:48:00 | 显示全部楼层
Super169 发表于 2016-5-30 22:36
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.

資料接收是設8位元,就能正常顯示。
那我如果要他是7位元,能夠這樣設嗎?
回复 支持 反对

使用道具 举报

发表于 2016-5-31 09:44:30 | 显示全部楼层
s930427 发表于 2016-5-31 08:48
資料接收是設8位元,就能正常顯示。
那我如果要他是7位元,能夠這樣設嗎?

Serial.begin 除了可設定 baud rate  外, 還可以接受一些預設的 config.  Syntax:  Serial.begin(speed, config)
詳情可參考: https://www.arduino.cc/en/Serial/Begin

如果你要用 N71 (no parity, 7 bit data, 1 bit stop), 可以改成

Serial.begin(38400, SERIAL_7N1);
回复 支持 反对

使用道具 举报

发表于 2016-5-31 10:15:13 | 显示全部楼层
兩個 Serial 怎樣分配?

另注意這一句中的轉換問題: Serial.readBytes(A,13);  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-31 14:01:03 | 显示全部楼层
Super169 发表于 2016-5-31 09:44
Serial.begin 除了可設定 baud rate  外, 還可以接受一些預設的 config.  Syntax:  Serial.begin(speed,  ...

感謝大大。
後來改用Serial.begin(38400, SERIAL_7N1);做輸出
但是收到的數值更糟糕,剩下一個值
是因為我用7bit輸出,所以資料陣列的資料型態又錯嗎?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 16:23 , Processed in 0.045676 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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