private void DealWithSERFun() { while (RecvTag) { bool Tag1 = false; bool Tag2 = false; bool Tag3 = false; bool Tag4 = false; lock (Data.SERList01) { if (Data.SERList01.Count >= 11) { byte[] ret = Data.SERList01.Skip(5).Take(4).ToArray(); int weight = ret[0] * 256 + ret[1]; if (Data.SERList01[0] == 0x04 && Data.SERList01[1] == 0x00 && Data.SERList01[2] == 0x01) { Data.SER1_speed_value = weight; } else { MyLog.Error("SERList01 串口数据偏移了!"); } Data.SERList01.RemoveRange(0, 11); Tag1 = true; } else { Tag1 = false; } } lock (Data.SERList02) { if (Data.SERList02.Count >= 9) { byte[] ret = Data.SERList02.Skip(3).Take(4).ToArray(); float temp = BitConverter.ToSingle(ret, 0); if (Data.SERList02[1] == 0x31) { Data.SER2_speed_value = temp; } else if (Data.SERList02[1] == 0x30) { Data.SER2_niuju_value = temp; } else { MyLog.Error("SERList02 串口数据偏移了!"); } Data.SERList02.RemoveRange(0, 9); Tag2 = true; } else { Tag2 = false; } } lock (Data.SERList03) { if (Data.SERList03.Count >= 9) { byte[] ret = Data.SERList03.Skip(3).Take(4).ToArray(); float temp = BitConverter.ToSingle(ret, 0); if (Data.SERList03[1] == 0x31) { Data.SER3_speed_value = temp; } else if (Data.SERList03[1] == 0x30) { Data.SER3_niuju_value = temp; } else { MyLog.Error("SERList03 串口数据偏移了!"); } Data.SERList03.RemoveRange(0, 9); Tag3 = true; } else { Tag3 = false; } } lock (Data.SERList04) { if (Data.SERList04.Count >= 100) { byte ret = Data.SERList04[0]; Data.SERList04.RemoveRange(0, 100); Tag4 = true; } else { Tag4 = false; } } if (Tag1 == false && Tag2 == false && Tag3 == false && Tag4 == false) { Thread.Sleep(100); } } }
private void RecvAllUSB() { CyUSBDevice MyDevice01 = USB.MyDeviceList[Data.OnlyId]; startDT = DateTime.Now; DateTime midDT = startDT; RecvdMB = 0; TempStoreBufTag = 0; while (RecvTag) { if (MyDevice01.BulkInEndPt != null) { byte[] buf = new byte[4096]; int buflen = 4096; lock (MyDevice01) MyDevice01.BulkInEndPt.XferData(ref buf, ref buflen); if (buflen > 0) { Trace.WriteLine("收到数据包长度为:" + buflen.ToString()); // lock (TempStoreBuf) Array.Copy(buf, 0, TempStoreBuf, TempStoreBufTag, buflen); TempStoreBufTag += buflen; byte[] Svbuf = new byte[buflen]; Array.Copy(buf, Svbuf, buflen); SaveFile.Lock_1.EnterWriteLock(); SaveFile.DataQueue_SC1.Enqueue(Svbuf); SaveFile.Lock_1.ExitWriteLock(); while (TempStoreBufTag >= 4096) { if (TempStoreBuf[0] == 0xff && (0x0 <= TempStoreBuf[1]) && (TempStoreBuf[1] < 0x11)) { DealWithLongFrame(ref TempStoreBuf, ref TempStoreBufTag); } else { MyLog.Error("收到异常帧!"); Trace.WriteLine("收到异常帧" + TempStoreBufTag.ToString()); // lock(TempStoreBuf) Array.Clear(TempStoreBuf, 0, TempStoreBufTag); TempStoreBufTag = 0; } } } else if (buflen == 0) { // Trace.WriteLine("数传422机箱 收到0包-----0000000000"); } else { Trace.WriteLine("收到buflen <0"); } endDT = DateTime.Now; double tempTime = endDT.Subtract(midDT).TotalSeconds; if (tempTime > 2) { midDT = endDT; double tempMB = Recv4KCounts / 256; Recv4KCounts = 0; //myMonitor.textBox_speed.BeginInvoke(new Action(() => //{ // double speed = tempMB / tempTime; // myMonitor.textBox_speed.Text = speed.ToString(); // myMonitor.progressBar1.Value = (int)speed; //})); } } } endDT = DateTime.Now; //myMonitor.textBox_time.BeginInvoke( // new Action(() => // { // double costTime = endDT.Subtract(startDT).TotalSeconds; // double RecvdM = RecvdMB / 1024; // myMonitor.textBox_time.Text = costTime.ToString(); // myMonitor.textBox_recvsize.Text = RecvdM.ToString(); // myMonitor.textBox_avspeed.Text = (RecvdM / costTime).ToString(); // })); }
void DealWithLongFrame(ref byte[] TempBuf, ref int TempTag) { ThisCount = TempStoreBuf[2] * 256 + TempStoreBuf[3]; if (LastCount != 0 && ThisCount != 0 && (ThisCount - LastCount != 1)) { MyLog.Error("出现漏帧情况!!"); Trace.WriteLine("出现漏帧情况:" + LastCount.ToString("x4") + "--" + ThisCount.ToString("x4")); } LastCount = ThisCount; byte[] buf_LongFrame = new byte[4096]; Array.Copy(TempStoreBuf, 0, buf_LongFrame, 0, 4096); Array.Copy(TempStoreBuf, 4096, TempStoreBuf, 0, TempStoreBufTag - 4096); TempStoreBufTag -= 4096; RecvdMB += 4; Recv4KCounts += 1; if (buf_LongFrame[0] == 0xff && buf_LongFrame[1] == 0x08) { //FF08为短帧通道 byte[] bufsav = new byte[4092]; Array.Copy(buf_LongFrame, 4, bufsav, 0, 4092); //SaveFile.Lock_2.EnterWriteLock(); //SaveFile.DataQueue_SC2.Enqueue(bufsav); //SaveFile.Lock_2.ExitWriteLock(); for (int i = 0; i < 6; i++) { if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x00) //保留 { int num = bufsav[i * 682 + 2] * 256 + bufsav[i * 682 + 3]; //有效位 byte[] buf1D0x = new byte[num]; Array.Copy(bufsav, i * 682 + 4, buf1D0x, 0, num); //SaveFile.Lock_3.EnterWriteLock(); //SaveFile.DataQueue_SC3.Enqueue(buf1D0x); //SaveFile.Lock_3.ExitWriteLock(); // string temp = null; // for (int j = 0; j < num; j++) temp += buf1D0x[j].ToString("x2"); } else if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x01) //对应第1个圆盘 { int num = bufsav[i * 682 + 2] * 256 + bufsav[i * 682 + 3]; //有效位 byte[] buf1D0x = new byte[num]; Array.Copy(bufsav, i * 682 + 4, buf1D0x, 0, num); //SaveFile.Lock_4.EnterWriteLock(); //SaveFile.DataQueue_SC4.Enqueue(buf1D0x); //SaveFile.Lock_4.ExitWriteLock(); lock (Data.SERList01) { Data.SERList01.AddRange(buf1D0x); } } else if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x02) //对应第2个圆盘 { int num = bufsav[i * 682 + 2] * 256 + bufsav[i * 682 + 3]; //有效位 byte[] buf1D0x = new byte[num]; Array.Copy(bufsav, i * 682 + 4, buf1D0x, 0, num); //SaveFile.Lock_5.EnterWriteLock(); //SaveFile.DataQueue_SC5.Enqueue(buf1D0x); //SaveFile.Lock_5.ExitWriteLock(); lock (Data.SERList02) { Data.SERList02.AddRange(buf1D0x); } } else if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x03) //对应第3个圆盘 { int num = bufsav[i * 682 + 2] * 256 + bufsav[i * 682 + 3]; //有效位 byte[] buf1D0x = new byte[num]; Array.Copy(bufsav, i * 682 + 4, buf1D0x, 0, num); //SaveFile.Lock_6.EnterWriteLock(); //SaveFile.DataQueue_SC6.Enqueue(buf1D0x); //SaveFile.Lock_6.ExitWriteLock(); lock (Data.SERList03) { Data.SERList03.AddRange(buf1D0x); } } else if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x0C) //报警参数 { int num = bufsav[i * 682 + 2] * 256 + bufsav[i * 682 + 3]; //有效位 byte[] buf1D0x = new byte[num]; Array.Copy(bufsav, i * 682 + 4, buf1D0x, 0, num); //SaveFile.Lock_6.EnterWriteLock(); //SaveFile.DataQueue_SC6.Enqueue(buf1D0x); //SaveFile.Lock_6.ExitWriteLock(); lock (Data.SERList04) { Data.SERList04.AddRange(buf1D0x); } //myMonitor.textBox_speed.BeginInvoke(new Action(() => //{ // double speed = tempMB / tempTime; // myMonitor.textBox_speed.Text = speed.ToString(); // myMonitor.progressBar1.Value = (int)speed; //})); } else if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x0D) { int num = bufsav[i * 682 + 2] * 256 + bufsav[i * 682 + 3];//有效位 byte[] buf1D0x = new byte[num]; Array.Copy(bufsav, i * 682 + 4, buf1D0x, 0, num); //SaveFile.Lock_7.EnterWriteLock(); //SaveFile.DataQueue_SC7.Enqueue(buf1D0x); //SaveFile.Lock_7.ExitWriteLock(); lock (Data.ADList01) { Data.ADList01.AddRange(buf1D0x); //for (int j = 0; j < num; j++) // Data.ADList01.Add(buf1D0x[j]); } } else if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x0E) { int num = bufsav[i * 682 + 2] * 256 + bufsav[i * 682 + 3];//有效位 byte[] buf1D0x = new byte[num]; Array.Copy(bufsav, i * 682 + 4, buf1D0x, 0, num); //SaveFile.Lock_8.EnterWriteLock(); //SaveFile.DataQueue_SC8.Enqueue(buf1D0x); //SaveFile.Lock_8.ExitWriteLock(); lock (Data.ADList02) { Data.ADList02.AddRange(buf1D0x); //for (int j = 0; j < num; j++) // Data.ADList02.Add(buf1D0x[j]); } } else if (bufsav[i * 682 + 0] == 0x1D && bufsav[i * 682 + 1] == 0x0f) { //空闲帧 } else { Trace.WriteLine("FF08通道出错!"); } } } }
private void WriteToFileSC(int key, object file, ref Queue <byte[]> myQueue, ref ReaderWriterLockSlim myLock) { Trace.WriteLine("Start WriteToFileSC Thread:" + key.ToString()); FileStream myfile = (FileStream)file; BinaryWriter bw = new BinaryWriter(myfile); // FileInfo fileInfo; while (SaveOn) { if (myQueue.Count() > 0) { try { myLock.EnterReadLock(); bw.Write(myQueue.Dequeue()); bw.Flush(); myLock.ExitReadLock(); #region 分割文件,防止文件过大 long FileSizeMB = myfile.Length / (1024 * 1024 * 1024); if (FileSizeMB > 1) { myFileList_dat[key].Flush(); string Path2 = myFileList_dat[key].Name; int count = Path2.LastIndexOf("\\"); Path2 = Path2.Substring(0, count + 1); myFileList_dat[key].Close(); FileStream newFile; string timestr = string.Format("{0}-{1:D2}-{2:D2} {3:D2}:{4:D2}:{5:D2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second); string filename = Path2 + timestr + ".dat"; newFile = new FileStream(filename, FileMode.Create); myFileList_dat.Remove(myFileList_dat[key]); myFileList_dat.Insert(key, newFile); break; //break跳出循环会执行新线程 } #endregion } catch (Exception e) { bw.Close(); Trace.WriteLine(myQueue.Count()); MyLog.Error(e.Message); break; } } else { Thread.Sleep(200); // Trace.WriteLine("Queue0 is empty!!"); } } bw.Close(); Trace.WriteLine("Leaving WriteToFileSC:" + key.ToString()); if (SaveOn) { WriteToFileSC(key, myFileList_dat[key], ref myQueue, ref myLock); } }