- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我向串口发送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
trở lại;
}
else //// Dest is neither <, >, nor =, we have logic error
{
ErrorFlags.SerialPortErrorDescription = (int)AnError.ExistsInTheSerialPortBufferPointers;
trở lại;
}
}
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;
trở lại;
}
else //// Dest is neither <, >, nor =, we have logic error
{
ErrorFlags.SerialPortErrorDescription = (int)AnError.ExistsInTheSerialPortBufferPointers;
trở lại;
}
}
}
câu trả lời hay nhất
这里是找到答案的地方......
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
希望我在这里的回答是正确的。
无论如何,此方法的最终结果是此方法读取真正的字节,作为字节,由另一端的任何内容发送到串行端口。
关于c# - 0xFF 变成 0x3F,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980631/
Sự cố và bản ghi khắc phục sự cố--Kết nối Java RMI bị từ chối lưu trữ: xxxx.... Khi học JavaRMI, tôi gặp phải các lý do sự cố sau:
Tôi đang thử nghiệm loại Rank-N và cố gắng nhập xx . Nhưng tôi thấy rằng cả hai chức năng đều có thể được nhập theo cùng một cách, điều này khá không trực quan. f :: (forall a b. a -> b) -> cfx = xxg ::
Câu hỏi này đã có câu trả lời: Làm cách nào để so sánh hai Chuỗi phiên bản trong Java? (31 câu trả lời) Đã đóng 8 năm trước. Có ai biết cách so sánh hai chuỗi phiên bản trong Java không
Câu hỏi này đã có câu trả lời: Các toán tử tăng sau (i++) và tăng trước (++i) hoạt động như thế nào trong Java?
Sau đây là đầu ra của lệnh netstat với các tùy chọn -n và -r, trong đó trường đích hiển thị địa chỉ được nén (127.1/16). Tôi muốn biết liệu có cách nào hoặc tùy chọn nào để lệnh netstat hiển thị toàn bộ IP mục tiêu (127.1.1.1) không.
Mình biết cách chứng minh: (- ∀ x, px) → (∃ x, - px) Cách chứng minh là: định lý : (- ∀ x, px) → (∃ x, - px) := bắt đầu giới thiệu n
Làm cách nào x * x có thể được thay đổi bằng cách lưu trữ nó trong "biến tự động"? Tôi nghĩ nó vẫn giống nhau và thử nghiệm của tôi cho thấy rằng loại, kích thước và giá trị rõ ràng là giống nhau. Nhưng ngay cả x * x == (xx = x * x) cũng sai. Cái gì
Giả sử, chúng ta diễn đạt nó như thế này: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
Tôi có một chuỗi 1234X5678 và tôi sử dụng biểu thức chính quy này để khớp với mẫu .X|..X|X. Tôi nhận được 34X. Câu hỏi đặt ra là tại sao tôi không nhận được 4X hoặc X5? Tại sao biểu thức chính quy chọn thực thi mẫu thứ hai? Câu trả lời hay nhất ở đây
Một người bạn của tôi đã gặp phải vấn đề này trong một cuộc phỏng vấn. Tìm giá trị của x làm cho hàm trả về đúng. function f(x) { return (x++ !== x) && (x++ === x);
Câu hỏi này đã có câu trả lời ở đây: đã đóng cửa 10 năm trước. Có thể trùng lặp: Làm việc với foo không dễ dàng hơn khi nó được biểu diễn b
Tôi mới sử dụng Android và đang thực hành phát triển ứng dụng nhắm mục tiêu phiên bản 2.2 và tôi cần trợ giúp để hiểu cách mở rộng ứng dụng của mình sang các phiên bản khác, cụ thể là 1.x, 2.3.x, 3.x và 4.xx và một số cho độ phân giải màn hình
Tại sao trường hợp 1 cho chúng ta:error: TypeError: x is unexpected on line... //case 1 var x.push(x);
Mã đầu tiên: # CASE 01 def test1(x): x += x print xl = [100] test1(l) print l CASE01 đầu ra: [100, 100
Tôi đang cố gắng hoàn thiện những tính toán lớn của mình. Nếu tôi có một hàm di chuyển tất cả các mục sang bên phải 'i' 2 khoảng trắng, thì tôi có một công thức trông như thế này: (n -1) + (n - 2) + (n - 3) ... (n - n) lần lặp đầu tiên tôi phải
Với một chuỗi IP (như xxxx/x), tôi sẽ tính toán phạm vi của IP như thế nào. Trường hợp phổ biến nhất có thể là 198.162.1.1/24 nhưng nó có thể là bất kỳ thứ gì, vì luật pháp cho phép mọi thứ. Tôi muốn mang 198.162.1.1/
Trong nỗ lực viết mã Javascript sạch khi mới bắt đầu, gần đây tôi đang đọc bài viết này thì tình cờ thấy đoạn này, về các không gian tên trong JavaScript: The code at the ve
Tôi đang viết một tập lệnh mà tôi muốn tránh làm ô nhiễm phần còn lại của DOM, đó sẽ là tập lệnh của bên thứ 3 thu thập một số dữ liệu phân tích cơ bản về khách truy cập. Tôi thường tạo một "không gian tên" giả bằng cách sử dụng: var x = x || {};
Tôi đã thử chạy bộ test_container_services.py nhưng gặp phải sự cố sau: docker.errors.APIError: 500 Server Error: Internal Server Error ("b'{" message
Có những tình huống nào mà hai câu lệnh if này sẽ tạo ra các kết quả khác nhau không? if(x as X != null) { // Làm gì đó } if(x is X) { // Làm gì đó } ed.
Tôi là một lập trình viên xuất sắc, rất giỏi!