s930427 发表于 2016-5-30 15:10:35

求大神幫解~急

本帖最后由 s930427 于 2016-5-30 15:11 编辑

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

圖為封包格式


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



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

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

extern uint8_t BigFont[];
extern uint8_t SmallFont[];
char buf;
byte R;
byte A;

void setup() {
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setFont(BigFont);
myGLCD.setColor(255, 255, 255); //BLACK

Serial.begin(38400);
//Serial.begin(4800, SERIAL_7E1);
Serial3.begin(38400);
Wire.begin();
//Serial3.begin(38400, SERIAL_7E1);
}

void loop() {
// Serial.print(48, HEX);
myGLCD.print("R & W", CENTER, CENTER);
//READp();
writep();
//Serial.end();
//Serial3.end();

}

void serial()
{
R = Serial.available();
myGLCD.printNumI(R , 0, 0);

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

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

    for (int i = 0; i < 13; i++)
    {
      Serial.print(A); // 回傳給 serial 收到的資料
      Serial3.print(A); // 並傳到 serial 3
      myGLCD.print("SERIAL READ ", 50, 0);
      myGLCD.printNumI(A , i * 35, 30);
      delay(100);
    }
}



}
////////////////////////////////////////////////////////////////////////////////////

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


byte Response;
Serial3.readBytes(Response, 13);

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

}

//////////////////////////////////////////////////////////////////
void writep()
{
/*                           _____________________________________________________________
   *封包格式       EOT01   | STX | H/G |IID | address |   data 8|SET | ETX | BCC|
                               | 02h | 'H' | '2'| 4byte   |   8byte   |'0''1'| 03h | >1Fh |
*/
//               |   |       |   STX|   ||                |                              |       |       |   |
byte wrequest={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
//byte wrequest[] = {0x04, '0', '1', 0x02, 'H', '4', '0', '1', '2', 'C', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', 0x03, 0x28};
//byte wrequest={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

//Serial3.write(wrequest, 19); // send requestthrough Serial3note write send binary data to serial port
for (int a = 0; a < 27; a++)
{
    sendbyte(wrequest);
   
    //delay(2/10);
}

//Serial.write(ss);
delay(1000);

Serial.write(wrequest, 27);
// delay(50);

//Serial3.write(0);   // 回傳ERROR封包 為 80 (HEX)
//Serial3.write(1);   // 不回傳 不顯示
//byte A={1,0};
//={0,0};    //0! ReceiveErrorBCC    RAW 回傳ERROR封包 為 80 (HEX)
//Serial3.write(A,2);
//Serial3.print(0);//70   //key 0 get 40 回應 /key 1 | 2no responsekey 00 顯示 1f 回應 40
//Serial3.print(1);//7C


//byte wrequest2={1,1};
//Serial3.write(wrequest,19);
//Serial.write(wrequest,19);   // arduino
//Serial3.print(1);

for (int j = 0; j < 14; j++) {
    myGLCD.printNumI(wrequest , j * 35, 0);
    myGLCD.print(itoa(wrequest, buf, 16) , j * 35, 20);
}
}

/* below is result at protocol monitor
0    6F 1F 19 1F 19 1F 1F 1F 1F 1F 1F 1F 1F 1F 79 0F   oy
1   76 6F 1F 19 1F 19 1F 1F 1F 1F 1F 1F 1F 1F 1F 79 0Fvoy

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

*/
/*//仿c的printf
/*void pf(const char *fmt, ... ){
    char tmp; // resulting string limited to 128 chars
    va_list args;
    va_start (args, fmt );
    vsnprintf(tmp, 128, fmt, args);
    va_end (args);
    Serial.print(tmp);
}*/
void sendbyte(char val)
{
Serial.print(val);
delay(1/10);
}
void sendstring(char *val)
{
while (*val != '\0')
{

    sendbyte(*val++);
}
}











Super169 发表于 2016-5-30 16:28:51

咁長無認真睇, 只係見到 sendbyte 入面果句, 應該好大問題:
Serial.print(val);

做呢類通訊, 一定係用 write, 唔會用 print.

Super169 发表于 2016-5-30 16:30:31

Sorry, 你又好似係用
Serial.write(wrequest, 27);

睇漏左....
真係太長, 仲好多 comment, 好難睇.

Super169 发表于 2016-5-30 16:41:06

"按照封包格式傳送,單接收結果為完全不同"
或者會唔會講清楚, 你話有問題既, 係發出既資料定係回傳既資料?
程式之中只可以猜想發出的資料, 如果問題是回傳的資料, 在 程式中不能看到吧.

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

s930427 发表于 2016-5-30 17:30:20

Super169 发表于 2016-5-30 16:41 static/image/common/back.gif
"按照封包格式傳送,單接收結果為完全不同"
或者會唔會講清楚, 你話有問題既, 係發出既資料定係回傳既資料 ...

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

Super169 发表于 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 .... ?

Super169 发表于 2016-5-30 18:09:54

或者可以先測試一下連線, 做個最簡單的程式, 只在 setup 中 送出幾個 Serial.write, 看看接收是否正確.
如果這樣也不正確, 就可能是 serial 連線的設定上有問題了.

s930427 发表于 2016-5-30 21:14:43

Super169 发表于 2016-5-30 18:08
嘗試粗略跟你的程式行一次,

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


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

Super169 发表于 2016-5-30 22:33:29

你的程式中:
byte wrequest={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.

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

Super169 发表于 2016-5-30 22:36:09

arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.

s930427 发表于 2016-5-30 23:50:48

Super169 发表于 2016-5-30 22:36 static/image/common/back.gif
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.

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

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

感謝您回復。

s930427 发表于 2016-5-31 08:48:00

Super169 发表于 2016-5-30 22:36 static/image/common/back.gif
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.

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

Super169 发表于 2016-5-31 09:44:30

s930427 发表于 2016-5-31 08:48 static/image/common/back.gif
資料接收是設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);

eddiewwm 发表于 2016-5-31 10:15:13

兩個 Serial 怎樣分配?

另注意這一句中的轉換問題: Serial.readBytes(A,13);

s930427 发表于 2016-5-31 14:01:03

Super169 发表于 2016-5-31 09:44 static/image/common/back.gif
Serial.begin 除了可設定 baud rate外, 還可以接受一些預設的 config.Syntax:Serial.begin(speed,...

感謝大大。
後來改用Serial.begin(38400, SERIAL_7N1);做輸出
但是收到的數值更糟糕,剩下一個值
是因為我用7bit輸出,所以資料陣列的資料型態又錯嗎?
页: [1] 2
查看完整版本: 求大神幫解~急