private bool SendHexDate(Stm8HexData hd, int row) { int retryCnt = 0; while (retryCnt < 5) { UpdateProgress(String.Format(" {0:X2}:", hd.Page)); if (hd == null) { UpdateLog(String.Format("\r\n\r\n第 {0} 筆資料錯誤, 燒錄停止......\r\n", row)); return(false); } else { byte servoResponse; if (!WriteStm8HexData(hd, out servoResponse)) { UpdateLog("\r\n\r\n燒錄失敗......\r\n", true); // This case may retry // return false; } else { if (servoResponse == 0xA0) { break; } // retry for any case even A1 /* * if (servoResponse != 0xA1) * { * UpdateLog("\r\n\r\n回傳不正常, 燒錄停止......\r\n", true); * // return false; * } */ } } UpdateProgress("ERR "); retryCnt++; } if (retryCnt >= 5) { UpdateLog(String.Format("\r\n\r\n第 {0} 筆資料多次傳送錯誤, 燒錄停止......\r\n", row)); return(false); } UpdateProgress("OK "); return(true); }
public bool ReadFile(List <string> txtData) { data = new List <Stm8HexData>(); if (txtData.Count == 0) { return(true); } string r1 = txtData[0]; int page, offset, dataLen; if (!Stm8HexData.GetPage(r1, out page, out offset, out dataLen)) { return(false); } if (offset != 0) { return(false); } startPage = (byte)page; dataRowCnt = 0; int line = 0; int cmdPage = startPage; bool goNext = true; while (goNext && (line < txtData.Count)) { Stm8HexData hd = new Stm8HexData(cmdPage); int dataRow = 0; if (hd.ReadData(line, txtData, out dataRow)) { dataRowCnt += dataRow; data.Add(hd); } else { goNext = false; break; } cmdPage++; line += 4; } return(true); }
private bool WriteStm8HexData(Stm8HexData hd, out byte servoReturn) { UpdateLog("\r\n=> "); receiveBuffer.Clear(); byte[] startCode = { 0xA7, hd.Page }; SerialSendByte(startCode); if (receiveBuffer.Count > 0) { // unexpected return; byte[] b = ShowReceiveBuffer(); servoReturn = b[b.Length - 1]; // just check the last one is enqugh return(false); } for (int i = 0; i < 64; i++) { SerialSendByte(hd.Data(i)); if (ServoReturned(out servoReturn)) { return(false); } } SerialSendByte(hd.CheckSum); return(WaitServoReturn(out servoReturn)); }
private bool WriteEmptyPage(byte page, out byte servoReturn) { Stm8HexData hd = new Stm8HexData(page); return(WriteStm8HexData(hd, out servoReturn)); }
private void GoBurn() { UpdateInfo("偵測舵機"); UpdateLog("偵測舵機.\r\n=> ", true); bool waitReply = true; int sendCnt = 0; int maxSend = 500; byte lastByte = 0; while (waitReply) { if (sendCnt > maxSend) { UpdateLog("\r\n\r\n偵測超時: 舵機沒回應", true); UpdateInfo("偵測超時: 舵機沒回應", UTIL.InfoType.error); return; } SerialSendByte(0xA5, true); Thread.Sleep(10); sendCnt++; while (receiveBuffer.Count > 0) { UpdateLog("\r\n<= ", true); lastByte = receiveBuffer[0]; UpdateLog(String.Format(" {0:X2}", lastByte), true); // Just for safety, differnt response from servo, A0 & A1 may cause by previous incomplete write if ((lastByte == 0xA9) || (lastByte == 0xE9) || (lastByte == 0xA1) || (lastByte == 0xA0)) { waitReply = false; } receiveBuffer.RemoveAt(0); } } if ((lastByte == 0xA0) || (lastByte == 0xA1)) { string s1 = "偵測到之前燒錄未完成"; string s2 = "安全起見, 請重置舵機, 再次重新燒錄."; UpdateLog(string.Format("\r\n\r\n!!!! {0} !!!!\r\n{1}", s1, s2), true); MessageBox.Show(s2, s1); return; } UpdateInfo("燒錄進行中, 請耐心等待......"); UpdateLog("\r\n\r\n開始燒錄......\r\n", true); double nPage = sendData.Count; byte endPage = sendData.EndPage; if (endPage < 0x7F) { nPage += (0x7F - endPage); } for (int i = 0; i < sendData.Count; i++) { Stm8HexData hd = sendData.GetHexData(i); if (!SendHexDate(hd, i)) { return; } UpdatePorgress((double)100.0 * i / nPage); } for (int i = endPage + 1; i < 0x80; i++) { Stm8HexData hd = new Stm8HexData(i); hd.Reset(); if (!SendHexDate(hd, 999)) { return; } UpdatePorgress((double)100.0 * (sendData.Count + i) / nPage); } UpdatePorgress(100); UpdateLog("\r\n=> "); SerialSendByte(0xA9); if (WaitServoReturn(out lastByte)) { if (lastByte == 0xA0) { UpdateLog("\r\n\r\n燒錄完成\r\n", true); UpdateInfo("燒錄順利完成"); return; } } UpdateLog("\r\n\r\n燒錄完成, 但終結的 0xA9 沒回傳 A0\r\n", true); UpdateInfo("燒錄完成, 但終結的 0xA9 沒回傳"); return; }
private void GoBurn() { writeSend = true; UpdateInfo("偵測舵機"); UpdateLog("偵測舵機.\r\n=> ", true); bool waitReply = true; int sendCnt = 0; int maxSend = 500; byte lastByte = 0; receiveBuffer.Clear(); while (waitReply) { if (sendCnt > maxSend) { UpdateLog("\r\n\r\n偵測超時: 舵機沒回應", true); UpdateInfo("偵測超時: 舵機沒回應", MyUtil.UTIL.InfoType.error); return; } if (!writeSend) { writeSend = true; UpdateLog("\r\n=> ", true); } SerialSendByte(0xA5, true); Thread.Sleep(10); sendCnt++; while (receiveBuffer.Count > 0) { writeSend = false; UpdateLog("\r\n<= ", true); lastByte = receiveBuffer[0]; UpdateLog(String.Format(" {0:X2}", lastByte), true); receiveBuffer.RemoveAt(0); if ((lastByte == 0xA9) || (lastByte == 0xA1) || (lastByte == 0xA0)) { waitReply = false; break; } } } // cleanup buffer, just for safety Thread.Sleep(1000); if (receiveBuffer.Count > 0) { for (int i = 0; i < receiveBuffer.Count; i++) { UpdateLog(String.Format(" {0:X2}", receiveBuffer[i]), true); } } receiveBuffer.Clear(); // for very very very rare case, the data can complete a previous transaction, and got a A0 return. // It's almost mission impossible, just keep the logic for safety check if (lastByte == 0xA0) { string s1 = "偵測到之前燒錄未完成"; string s2 = "安全起見, 請重置舵機, 再次重新燒錄."; UpdateLog(string.Format("\r\n\r\n!!!! {0} !!!!\r\n{1}", s1, s2), true); MessageBox.Show(s2, s1); return; } UpdateInfo("燒錄進行中, 請耐心等待......"); UpdateLog("\r\n\r\n開始燒錄......\r\n", true); double nPage = sendData.Count; byte endPage = sendData.EndPage; if (endPage < 0x7F) { nPage += (0x7F - endPage); } for (int i = 0; i < sendData.Count; i++) { Stm8HexData hd = sendData.GetHexData(i); if (!SendHexDate(hd, i)) { UpdateInfo(string.Format("Error sending page {0}", i)); return; } UpdatePorgress((double)100.0 * i / nPage); } for (int i = endPage + 1; i < 0x80; i++) { Stm8HexData hd = new Stm8HexData(i); hd.Reset(); if (!SendHexDate(hd, 999)) { UpdateInfo("Error sending last page"); return; } UpdatePorgress((double)100.0 * (sendData.Count + i) / nPage); } UpdatePorgress(100); UpdateLog("\r\n=> "); SerialSendByte(0xA9); /* * if (WaitServoReturn(out lastByte)) * { * if (lastByte == 0xA0) * { * UpdateLog("\r\n\r\n燒錄順利完成\r\n", true); * UpdateInfo("燒錄順利完成"); * return; * } * } */ UpdateLog("\r\n\r\n燒錄完成\r\n", true); UpdateInfo("燒錄完成"); return; }