我将0xFF发送到串口
我看到了0x3F。
所有其他字节都是正确的。
情况是这样的......
外部框将这些字节发送到PC ...
0xFF,0x0D,0x00,0x30,0x31,0x53,0x55,0x43,0x43,0x45,0x53,0x53
C#在缓冲区中产生这个......
0x3F,0x0D,0x00,0x30,0x31,0x53,0x55,0x43,0x43,0x45,0x53,0x53
第一个字节缺少前两位。有没有人见过这个?
如果这里有一篇文章解释了发生了什么,更重要的是为什么,甚至最重要的是如何修复它,请指出我。谢谢。
这是代码;我希望我已经找到了StackOverFlow系统;对于这个社区和我的C#知识来说仍然是一个新的角落,大概是1或2个月。
public static void OurBackGroundSerialPortReceiver(object sender, SerialDataReceivedEventArgs e )
{
//// Item 1, tell the world, particularly the
//// chief dispatch routin, that we are receiving
aUartSemaphoreThatTells.WhatTheUartBackgroundRxIsDoing = (int)aValueWhichIndicatesThat.theUARTisReceivingData;
SerialPort CurrentPort = (SerialPort)sender; //// Int routine gave is this in the arguments
int LastByteInUartBuffer = CurrentPort.ReadBufferSize;
int TheLastByteTheBoxSent = CurrentPort.BytesToRead;
string inputData = CurrentPort.ReadExisting(); //// This is a C# property method of ports
int Dest;
Dest = UartPlaceHolders.RxBufferLeader; //// Will index into buffer for Chief dispatch
int Source; //// Will index into Uart buffer to fish it out
Source = 0; //// therefore, we start at zero
int TopEdge; //// We'll calculate this here once instead of in the loops below
TopEdge = (int)TheSizeOf.OneSecondsWorthOfData; //// This will tell us when to wrap around
if (Dest < UartPlaceHolders.RxBufferTrailer) //// Half the time we'll have wrap-around
{ //// If that's the case, then the trailer > the leader
while (
(Dest < UartPlaceHolders.RxBufferTrailer) //// If we are wrapped, make sure we don't
&& //// overtake either the trailer or
(Dest < TopEdge) //// go over the top edge
&& //// At the same time, make sure that
(Source <= LastByteInUartBuffer) //// we don't fish out more than is there
)
{
UartData.TheImmediateSecondOfData[Dest] = (byte)inputData[Source]; //// Move bytes into buff for chief
Dest = Dest + 1;
Source = Source + 1;
}
if (Source >= LastByteInUartBuffer) //// Have we done all the bytes for this event ?
{ //// Yes, therefore we will update the leader
UartPlaceHolders.RxBufferLeader = Dest; //// This tells us where to start next time
aUartSemaphoreThatTells.WhatTheUartBackgroundRxIsDoing = (int)aValueWhichIndicatesThat.WeHaveReceivedSomeData;
return; //// and we are done
}
//// // // Else no, more bytes so...
else if (Dest >= TopEdge) //// Did we wrap around ?
{ //// Yes, so
Dest = 0; //// wrap around to the start
while ( //// Now we do the same thing again
Dest < UartPlaceHolders.RxBufferTrailer //// C# and windows keep buffers at 4K max,
&& //// so we will wrap only once
Source < LastByteInUartBuffer //// May not even need that other test
) //// This will finish the rest of the bytes
{
UartData.TheImmediateSecondOfData[Dest] = (byte)inputData[Source]; //// There they go
Dest = Dest + 1;
Source = Source + 1;
}
UartPlaceHolders.RxBufferLeader = Dest; //// This tells us where to start next time
return;
}
else //// Dest is neither <, >, nor =, we have logic error
{
ErrorFlags.SerialPortErrorDescription = (int)AnError.ExistsInTheSerialPortBufferPointers;
return;
}
}
if (Dest >= UartPlaceHolders.RxBufferTrailer) //// Now, if the Trailer is ahead of the leader, here we go
{ //// If that's the case, then the trailer > the leader
while (
//(Dest < UartPlaceHolders.RxBufferTrailer) //// This is the first major difference twixt this time & previous...
// && //// ...because This condition is defacto guarateed to be false now
(Dest < TopEdge) //// We still want to stop before we hit the top edge
&& //// At the same time, make sure that we go past...
(Source < LastByteInUartBuffer) //// ...the last byte the Uart gave us
&&
(Source < TheLastByteTheBoxSent)
)
{
UartData.TheImmediateSecondOfData[Dest] = (byte)inputData[Source]; //// Move bytes into buff for chief
Dest = Dest + 1;
Source = Source + 1;
}
if (Source >= LastByteInUartBuffer) //// Have we done all the bytes for this event ?
{ //// Yes, therefore we will update the leader
UartPlaceHolders.RxBufferLeader = Dest; //// This tells us where to start next time
return; //// and we are done
} //// // Else no, we have more bytes to move, so...
else if (Dest >= TopEdge) //// Did we wrap around ?
{ //// Yes, so...
Dest = 0; //// wrap around to the start
while ( //// Now we do the same thing again
Dest < UartPlaceHolders.RxBufferTrailer //// C# and windows keep buffers at 4K max,
&& //// so we will wrap only once
Source < LastByteInUartBuffer
)
{
UartData.TheImmediateSecondOfData[Dest] = (byte)inputData[Source];
Dest = Dest + 1;
Source = Source + 1;
}
UartPlaceHolders.RxBufferLeader = Dest; //// This tells us where to start next time
aUartSemaphoreThatTells.WhatTheUartBackgroundRxIsDoing = (int)aValueWhichIndicatesThat.WeHaveReceivedSomeData;
return;
}
else //// Dest is neither <, >, nor =, we have logic error
{
ErrorFlags.SerialPortErrorDescription = (int)AnError.ExistsInTheSerialPortBufferPointers;
return;
}
}
}
答案 0 :(得分:4)
这是找到答案的地方......
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx
向下滚动到“阅读”,它将详细说明用于执行此操作的方法,可在此处找到...
http://msdn.microsoft.com/en-us/library/ms143549.aspx
这是解决此问题的代码(可能是好的)
SerialPort CurrentPort = (SerialPort)sender; //// caller gave us this in the arguments
int TheNumberOfBytes = CurrentPort.BytesToRead; // The system will tell us how large our array should be
byte[] inputData = new byte[TheNumberOfBytes]; // Our array is not that large
int WeReadThisMany = CurrentPort.Read(inputData, 0, TheNumberOfBytes); //// This is a C# property method of ports
希望我在这里回答是正确的。
无论如何,最终的结果是这个方法读取实际字节,作为字节,通过另一方发送到串行端口。