今天我们郭工使用我写的EC20程序发现了一个严重的问题,就是运行一段时间后会出现丢数据的情况。使用供应商的程序却能很好的运行我很奇怪,仔细看了供应商的历程发现他们用的是select机制。
我突然有个灵感是不是我的读取串口导致了串口阻塞?一查果然是。
Linux下直接用read读串口可能会造成堵塞,或数据读出错误。然而用select先查询com口是否可读则可以避免这个问题。但是也会引起另一个问题,那就是会使使用select的线程在没有收到数据时像休眠阻塞一样。因为select是在 一定的时间内循环的去判断串口是否可读。
之前的旧程序
int main()
{
unsigned int i;
int return_value = 0;
unsigned long startCount = 0;//开机计时 重启后30分钟不变化
unsigned char Signal_Strength_temp;
unsigned char WIFIName_temp[33];
int TFcardState;//卡状态
int I_temp;
GS_PC_str.RevBufLen = 0;
//串口初始化 115200 bps,8 N 1
GS_PC_str.fd = Serial_Open("/dev/ttyHS0", B115200, EIGHT_BIT, PARITY_NONE, ONE_BIT, FLOW_CONTROL_NONE);
if(GS_PC_str.fd<0)
{
printf("serial open fail\n");
return 0;
}
else
{
printf("serial open success fd = %d\n",GS_PC_str.fd);
}
//卡状态
TFcardState = Hk_Camera_Get_SD_State(&GS_TF_state);
printf("return_value = %d\n", TFcardState);
printf("state->f_blocks = %d\n", GS_TF_state.f_blocks);
printf("state->f_bavail = %d\n", GS_TF_state.f_bavail);
printf("state->used_percent = %d\n", GS_TF_state.can_used_percent);
//配置自己的IP地址
HK_Camera_Init_Internet_Ip("192.168.1.5");
//拨号状态
GS_Call_state = Hk_Camera_Data_Call();
//开启摄像头功能
Hk_Camera_Paramete_Init();
Hk_Camera_Init_Camera("192.168.1.64", 13851, 0, 3);//开启第1(1~4)
Hk_Camera_Start_Camera_Communicate();
while(1)
{
//读取信号强度
GS_Signal_Strength = Hk_Camera_Get_Signal_Strength();
printf("Signal Strength = %d\n", GS_Signal_Strength);
if(GS_Signal_Strength>99)
{
Signal_Strength_temp = 98;
}
else
{
Signal_Strength_temp = GS_Signal_Strength;
}
//拨号状态
GS_Call_state = Hk_Camera_Get_Call_Data_State();
//读IMEI号
IMEI[0]=0x31;
IMEI[1]=0x39;
IMEI[2]=0x30;
IMEI[3]=0x38;
IMEI[4]=0x30;
IMEI[5]=0x35;
IMEI[6]=0x31;
IMEI[7]=0x34;
IMEI[8]= 0;
//判定摄像头是否在线
GS_camera_state = Hk_Camera_Get_Camera_State_By_Id(0);
romdatasCopeToRamDataS("摄像:", WIFIName_temp);//0~4
if(GS_camera_state == 1 )
{//CURRENT_STAT