using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
byte[] data = new byte[8];
byte[] sendData = new byte[8];
bool isOpen = true;
public Form1()
{
InitializeComponent();
data[0] = 0x01;
data[1] = 0x02;
data[2] = 0x03;
data[3] = 0x04;
data[4] = 0xe1;
data[5] = 0xe2;
data[6] = 0xe3;
data[7] = 0xe4;
sendData[0] = 0x20; //命令标志,上位机请求命令
sendData[1] = 0x24; //命令信息,设置定时
//数据位
sendData[2] = 0x0b; //设置年为11年
sendData[3] = 0x09; //设置月份为9月
sendData[4] = 0x15; //设置天为21号
sendData[5] = 0x00; //第四位数据位没有用到置为0
sendData[6] = 0x01; //设置校验位为1
sendData[7] = 0x0A; //设置结束位。暂定0x00s表示
}
public int aaa(byte[] datas)
{
int[] check = new int[6];
int count = 0;
for (int i = 0; i < 6; i++)
{
check[i] = datas[i];
while (check[i] > 0)
{
check[i] = (check[i] - 1) & check[i];
count++;
}
MessageBox.Show(count.ToString());
}
return 0;
}
private void button1_Click(object sender, EventArgs e)
{
//aaa(data);
Send_Data(sendData);
}
//数据发送方法
public int Send_Data(byte[] sendDatas)
{
//检查sendDatas是否为空
//检查串口的属性是否设置
//if (!isSetPorperty)
//{
// SetPortProperty(); //重新设置串口
// isSetPorperty = true; //标志位置为true
//}
sendDatas[6] = Convert.ToByte(PC_Calculate_Parity(sendDatas)); //填充校验位
MessageBox.Show(sendDatas[6].ToString());
return 0;
}
//上位机偶校验函数
private int PC_Calculate_Parity(byte[] Datas)
{
int[] check = new int[6];
int sum = 0;
int num = 0xAA, count = 0;
char a = (char)0xAf;
//while (num > 0)
//{
// //一个数的二进制表示中1的个数算法为:此数减1,再与自身相与,以此循环,直至该数小于等于0为止。循环的次数即为1的个数
// num = (num - 1) & num;
// count++;
//}
//MessageBox.Show(count.ToString());
for (int i = 0; i < 6; i++)
{
//for (int j = 0; j < 8; j++)
//{
// int s = (a & (0x01 << j));
// MessageBox.Show(s.ToString());
// if ((Datas[i] & (1 << j)) == 1)
// {
// check[i] += 1;
// }
//}
check[i] = Datas[i];
//check[i] = 0xf0;
while (check[i] > 0)
{
//一个数的二进制表示中1的个数算法为:此数减1,再与自身相与,以此循环,直至该数小于等于0为止。循环的次数即为1的个数
check[i] = (check[i] - 1) & check[i];
sum++;
}
MessageBox.Show(sum.ToString());
}
if (sum % 2 == 1)
return 1;
else
return 0;
}
//检测偶校验
private int PC_Check_Data(byte[] Datas)
{
int[] check = new int[6]; //存储每个字节1的个数
int sum = 0; //存储前6个字节1的个数
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 8; j++)
{
if ((Datas[i] & (1 << j)) == 1)
{
check[i] += 1;
}
}
sum += check[i];
}
sum += Convert.ToInt32(Datas[6]); //加上奇偶校验位
if (sum % 2 == 0) //偶校验,说明数据正确
{
MessageBox.Show("数据正确!");
return 1;
}
else
{
MessageBox.Show("数据失败!");
return 0;
}
}
}
}
C#---串口通信---位操作
最新推荐文章于 2025-03-16 14:41:33 发布