廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 5858 個閱讀者
 
<<   1   2  下頁 >>(共 2 頁)
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
tgs0910 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x61
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[求助] 我要如何用CKC去判別收到的資料是否正確
請問一下我要如何正確的接收由PLC回傳的RTU碼
要如何用CKC去判 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



獻花 x0 回到頂端 [樓 主] From:臺灣中華電信HINET | Posted:2007-03-08 23:10 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

你說的是 Modbus RTU 的 CRC16 吧!?
每個 Packet 的最後兩個 Byte 就是 CRC16

/* Table of CRC values for high-order byte */
unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ;

/* Table of CRC values for low-order byte */
unsigned char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;

/* The function return the CRC as a type unsigned short. */
/* CRC Generation Function */
WORD CRC16(BYTE *puchMsg, int usDataLen)
{
  BYTE uchCRCHi = 0xFF;     /* high CRC byte initialized */
  BYTE uchCRCLo = 0xFF;     /* low CRC byte initialized */
  WORD uIndex;           /* will index index into lookup */

  while (usDataLen--)             /* pass through message buffer */
  {
    uIndex = uchCRCHi ^ *puchMsg++;
    uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
    uchCRCLo = auchCRCLo[uIndex];
  }
  return (uchCRCHi << 8 | uchCRCLo);
}


獻花 x0 回到頂端 [1 樓] From:臺灣中華電信HINET | Posted:2007-03-09 01:52 |
tgs0910 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x61
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

謝謝大大每次都不厭其煩的幫小弟

CRC:   MOV DPH, #table ; 指向余式表下半區
      MOV DPL, R0 ; 指向對應單元
      CLR A ;
      MOVC A, @A+DPTR ; 讀余式的高位元組
      XRL A, R1 ; 計算余式的高位元組
      MOV R0, A ; 存入R0
      INC DPH ; 指向余式表上半區
      CLR A ;
      MOVC A, @A+DPTR ; 讀余式的低位元組
      XRL A, R2 ; 計算余式的低位元組
      MOV R1, A ; 存入R1
      RET
table: 要如何寫
謝謝


獻花 x0 回到頂端 [2 樓] From:臺灣中華電信HINET | Posted:2007-03-10 22:36 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

table 就是上面兩個表接在一起, 只是它要求將 auchCRCHi, auchCRCLo 放在 256 bytes 的邊界上
這個 CRC 副程式的參數好像是 R0(uchCRCHi), R1(uchCRCLo)
這樣新的資料要加入CRC時不是要先計算 R0 跟新資料的 XOR?

我比較喜歡用下面的程式:

; /* Table of CRC values for high-order byte */
auchCRCHi     equ   $
          db     00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h, 01h, C0h
          db     80h, 41h, 00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h
          db     00h, C1h, 81h, 40h, 00h, C1h, 81h, 40h, 01h, C0h
          db     80h, 41h, 01h, C0h, 80h, 41h, 00h, C1h, 81h, 40h
          db     00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h, 00h, C1h
          db     81h, 40h, 01h, C0h, 80h, 41h, 01h, C0h, 80h, 41h
          db     00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h, 00h, C1h
          db     81h, 40h, 00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h
          db     00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h, 01h, C0h
          db     80h, 41h, 00h, C1h, 81h, 40h, 00h, C1h, 81h, 40h
          db     01h, C0h, 80h, 41h, 01h, C0h, 80h, 41h, 00h, C1h
          db     81h, 40h, 01h, C0h, 80h, 41h, 00h, C1h, 81h, 40h
          db     00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h, 01h, C0h
          db     80h, 41h, 00h, C1h, 81h, 40h, 00h, C1h, 81h, 40h
          db     01h, C0h, 80h, 41h, 00h, C1h, 81h, 40h, 01h, C0h
          db     80h, 41h, 01h, C0h, 80h, 41h, 00h, C1h, 81h, 40h
          db     00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h, 01h, C0h
          db     80h, 41h, 00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h
          db     00h, C1h, 81h, 40h, 00h, C1h, 81h, 40h, 01h, C0h
          db     80h, 41h, 00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h
          db     01h, C0h, 80h, 41h, 00h, C1h, 81h, 40h, 01h, C0h
          db     80h, 41h, 00h, C1h, 81h, 40h, 00h, C1h, 81h, 40h
          db     01h, C0h, 80h, 41h, 01h, C0h, 80h, 41h, 00h, C1h
          db     81h, 40h, 00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h
          db     00h, C1h, 81h, 40h, 01h, C0h, 80h, 41h, 01h, C0h
          db     80h, 41h, 00h, C1h, 81h, 40h

; /* Table of CRC values for low-order byte */
auchCRCLo     equ   $
          db     00h, C0h, C1h, 01h, C3h, 03h, 02h, C2h, C6h, 06h
          db     07h, C7h, 05h, C5h, C4h, 04h, CCh, 0Ch, 0Dh, CDh
          db     0Fh, CFh, CEh, 0Eh, 0Ah, CAh, CBh, 0Bh, C9h, 09h
          db     08h, C8h, D8h, 18h, 19h, D9h, 1Bh, DBh, DAh, 1Ah
          db     1Eh, DEh, DFh, 1Fh, DDh, 1Dh, 1Ch, DCh, 14h, D4h
          db     D5h, 15h, D7h, 17h, 16h, D6h, D2h, 12h, 13h, D3h
          db     11h, D1h, D0h, 10h, F0h, 30h, 31h, F1h, 33h, F3h
          db     F2h, 32h, 36h, F6h, F7h, 37h, F5h, 35h, 34h, F4h
          db     3Ch, FCh, FDh, 3Dh, FFh, 3Fh, 3Eh, FEh, FAh, 3Ah
          db     3Bh, FBh, 39h, F9h, F8h, 38h, 28h, E8h, E9h, 29h
          db     EBh, 2Bh, 2Ah, EAh, EEh, 2Eh, 2Fh, EFh, 2Dh, EDh
          db     ECh, 2Ch, E4h, 24h, 25h, E5h, 27h, E7h, E6h, 26h
          db     22h, E2h, E3h, 23h, E1h, 21h, 20h, E0h, A0h, 60h
          db     61h, A1h, 63h, A3h, A2h, 62h, 66h, A6h, A7h, 67h
          db     A5h, 65h, 64h, A4h, 6Ch, ACh, ADh, 6Dh, AFh, 6Fh
          db     6Eh, AEh, AAh, 6Ah, 6Bh, ABh, 69h, A9h, A8h, 68h
          db     78h, B8h, B9h, 79h, BBh, 7Bh, 7Ah, BAh, BEh, 7Eh
          db     7Fh, BFh, 7Dh, BDh, BCh, 7Ch, B4h, 74h, 75h, B5h
          db     77h, B7h, B6h, 76h, 72h, B2h, B3h, 73h, B1h, 71h
          db     70h, B0h, 50h, 90h, 91h, 51h, 93h, 53h, 52h, 92h
          db     96h, 56h, 57h, 97h, 55h, 95h, 94h, 54h, 9Ch, 5Ch
          db     5Dh, 9Dh, 5Fh, 9Fh, 9Eh, 5Eh, 5Ah, 9Ah, 9Bh, 5Bh
          db     99h, 59h, 58h, 98h, 88h, 48h, 49h, 89h, 4Bh, 8Bh
          db     8Ah, 4Ah, 4Eh, 8Eh, 8Fh, 4Fh, 8Dh, 4Dh, 4Ch, 8Ch
          db     44h, 84h, 85h, 45h, 87h, 47h, 46h, 86h, 82h, 42h
          db     43h, 83h, 41h, 81h, 80h, 40h

CRC16:
    xrl   a, uchCRCHi   ; uIndex = uchCRCHi ^ *puchMsg++;
    mov   r7, a
    mov   dptr, #auchCRCHi
    movc   a, @a+dptr
    xrl   a, uchCRCLo
    mov   uchCRCHi, a   ; uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
    mov   dptr, #auchCRCLo
    mov   a, r7
    movc   a, @a+dptr
    mov   uchCRCLo, a   ; uchCRCLo = auchCRCLo[uIndex];
    ret

SendReadHolding:
    mov   uchCRCHi, #0FFh
    mov   uchCRCLo, #0FFh
    ;
    mov   a, #01h       ; Address
    call   SendChar
    call   CRC16
    mov   a, #03h       ; Function Code = 03 (Read Holding Registers)
    call   SendChar
    call   CRC16
    ;
    mov   a, #00h
    call   SendChar
    call   CRC16
    mov   a, #00h       ; Register Address 0000h
    call   SendChar
    call   CRC16
    ;
    mov   a, #00h
    call   SendChar
    call   CRC16
    mov   a, #01h       ; Regisetr Count 0001h
    call   SendChar
    call   CRC16
    ;
    mov   a, uchCRCHi
    call   SendChar
    mov   a, uchCRCLo
    call   SendChar
    ret


獻花 x0 回到頂端 [3 樓] From:臺灣中華電信HINET | Posted:2007-03-11 00:23 |
tgs0910 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x61
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

謝謝大大的幫助
可不可以再請教一下
要如何用TB8, RB8做奇同位或偶同位檢查
還有要如何把資料先收到的一直往高位址推
就是如果我連續收到30 31 32時就把30丟到72H裡
                                31     71H'
                                32     70H

如果是連續收到30 31 32 33時就把30 丟到73H
                                31     72H
                                32     71H
                                33     70H
就是把最後收到的位元組放在最低的位址
謝謝


獻花 x0 回到頂端 [4 樓] From:臺灣中華電信HINET | Posted:2007-03-12 22:24 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

51 本身就有偶同位的 P 位元可以使用(P 位元為 ACC 的偶同位)
因此你只要先將 SCON 設成 9-bit UART (SCON=D0h)
然後傳送部分:
; 偶同位
    mov   a, #01h
    mov   c, p
    mov   tb8, c
    call   SendChar
; 奇同位
    mov   a, #01h
    mov   c, p
    cpl   c
    mov   tb8, c
    call   SendChar

為何要把最後收到的資料放在最低位址?
一般要做這個必須要知道有多大的空間可以放及目前要放幾個
然後使用 xch 指令來做, 例如用簡單的範例來說(假設ACC為收到的資料)
; 範例一: 確定只有三個Bytes空間
    xch   a, 70h
    xch   a, 71h
    xch   a, 72h
; 範例二: 使用 R0, R2 來指定位址及空間大小
    mov   r0, #70h
    mov   r2, #3
Serial_Shift:
    xch   a, @r0
    inc   r0
    djnz   r2, Serial_Shift


獻花 x0 回到頂端 [5 樓] From:臺灣中華電信HINET | Posted:2007-03-13 01:39 |
tgs0910 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x61
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

不好意思在請問一下大大教小弟的115200bps
mov T2CON, #00110000b
mov RCAP2H, #HIGH (-3) ; -3 = 65533
mov RCAP2L, #LOW (-3)
mov TH2, RCAP2H
mov TL2, RCAP2L
setb TR2

設鮑率為115200bps
我用11.0592的石英震盪晶體
我用兩顆8051做傳輸沒有問題
但是我用南樺電機的rs232監聽軟體
和我的8051做rs232的傳輸
有收到東西卻是亂碼
謝謝


獻花 x0 回到頂端 [6 樓] From:臺灣 | Posted:2007-03-13 18:35 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

看起來沒問題! 你有檢查南華電機所使用的格式跟你一樣?
例如 8 Data bits, None parity, 1 Stop bit 還是其他格式?


獻花 x0 回到頂端 [7 樓] From:臺灣中華電信HINET | Posted:2007-03-13 19:52 |
tgs0910 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x61
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

ORG   00h      
      mov T2CON, #00110000b
      mov RCAP2H, #(-3) ; -3 = 65533
      mov RCAP2L, #(-3)
      mov TH2, RCAP2H
      mov TL2, RCAP2L
      setb   TR2
      mov   scon,#01110000b

我以經試過了格式是一樣的


獻花 x0 回到頂端 [8 樓] From:臺灣 | Posted:2007-03-14 15:57 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

mov   scon,#01110000b <- 你的格式是 8 Data bits, None Parity, 1 Stop bit

一般出現這種問題都是找第三個設備來測試. 例如電腦就是很好的監測設備
只要電腦用相同的格式接到正確的資料那就沒問題了. 再來的問題應該就是板子或程式的問題了.


獻花 x0 回到頂端 [9 樓] From:臺灣中華電信HINET | Posted:2007-03-14 23:56 |

<<   1   2  下頁 >>(共 2 頁)
首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.055847 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言