作者kimo (芒果义式低脂冰淇淋)
看板ASM
标题[问题] 请问使用C#写的RS232程式写入8051SoC後再读出的结果不一致?
时间Wed May 4 00:27:00 2011
8051 code(SoC用的是STC)
/******************************************************************/
/* Uart中断程序 */
/******************************************************************/
void UART_SER (void) interrupt 4 //Uart中断服务程序
{
unsigned char Temp; //定义临时变量
unsigned char i;
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
Temp=SBUF; //读入缓冲区的值
new_word[i]=Temp;
i++;
if(i==16) //连续接收16个字符信息
{
i=0;
SetFlag=1; //接收完成标志位置1
}
SBUF=Temp; //把接收到的值再发回电脑端
}
if(TI) //如果是发送标志位,清零
TI=0;
}
C# code
/*写入按钮事件*/
private void btn_write_Click(object sender, EventArgs e)
{
try
{
/*写入资料*/
byte[] RSdata = new byte[16] { 0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39,
0x41, 0x42, 0x43, 0x44, 0x45,
0x46 };
serialPort1.Write(RSdata,0,16);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误讯息", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
/*读取按钮事件*/
private void btn_read_Click(object sender, EventArgs e)
{
/*读取输入缓冲区资料*/
Byte[] RSdata =new Byte[16];
serialPort1.Read(RSdata,0,16);
string s="";
for (int i = 0; i < 16; i++)
s += ":0x" + RSdata[i].ToString("X2");
txt_read.Text = s;
/*显示目前输入缓冲区的剩余位元组数*/
lbl_inputlen.Text = serialPort1.BytesToRead.ToString();
}
执行结果分别如下:
第1次
0xA0:0xB1:0xB2:0xB3:0xB4:0xB5:0xB6:0xB7:
0xB8:0xB9:0xC1:0xC2:0xC3:0xC4:0xC5:0xC6
第2次
0xF0:0xB1:0xB2:0xB3:0xB4:0xB5:0xA6:0xB7:
0xB8:0xB9:0xC1:0xC2:0xC3:0xC4:0xC5:0xC6
第3次
0xB0:0xB1:0xB2:0xB3:0xB4:0xB5:0xA6:0xB7:
0xB8:0xB9:0xC1:0xC2:0xC3:0xC4:0xC5:0xC6
都非写入的
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46
请问各位高手 有谁知道原因吗?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.85.0.180
1F:推 WolfLord:are sure your buad rate and data width and stop bit 05/04 00:47
2F:→ WolfLord:all are crrorect ? 05/04 00:47
3F:推 WolfLord:看起来很像用7BIT收8BIT DATA (Bit7 永远等於1) 05/04 00:51
4F:推 ruemann:在中断里面那个i要改成全域或static 05/04 01:41
5F:→ ruemann:不过主要的原因可能是一楼说的 (资料SHIFT後长得蛮像的 05/04 01:41
6F:→ markov:纠个错 SHOULD YOUR ... ALL ARE CORRECT 不要两次动词跟错 07/01 01:58