⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gserial.c

📁 本程序是在LINUX下编写的串口程序设计
💻 C
📖 第 1 页 / 共 2 页
字号:
				break;			case 2:				tty_set_baud_rate(B1200);				break;			case 3:				tty_set_baud_rate(B1800);				break;			case 4:				tty_set_baud_rate(B2400);				break;			case 5:				tty_set_baud_rate(B4800);				break;			case 6:				tty_set_baud_rate(B9600);				break;			case 7:				tty_set_baud_rate(B19200);				break;			case 8:				tty_set_baud_rate(B38400);				break;			case 9:				tty_set_baud_rate(B57600);				break;			case 10:				tty_set_baud_rate(B115200);				break;			default:				g_warning("should no come here\n");				break;		}				lastindex = index;	}}void combo_select_bits_selectchild(GtkList *list,GtkWidget *child,gpointer data){	static gint lastindex=-1;	gint index;	g_assert( (index = gtk_list_child_position(list,child)) != -1);	if( index != lastindex )	{		switch(index)		{			case 0:				tty_set_bit_size(5);				break;			case 1:				tty_set_bit_size(6);				break;			case 2:				tty_set_bit_size(7);				break;			case 3:				tty_set_bit_size(8);				break;			default:				g_warning("should no come here\n");				break;		}		lastindex = index;	}}void combo_select_check_selectchild(GtkList *list,GtkWidget *child,gpointer data){	static gint lastindex=-1;	gint index;	g_assert( (index = gtk_list_child_position(list,child)) != -1);	if( index != lastindex )	{		tty_set_checkmod(index);		lastindex = index;	}}GtkWidget * MakeAppWindow(){	GtkWidget *window;	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	gtk_container_set_border_width(GTK_CONTAINER(window),10);	gtk_window_set_title(GTK_WINDOW(window),"串口调试器");	gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(CloseTheApp),NULL);	return window;}GtkWidget * MakeButton(GtkWidget *box,const gchar* caption,gpointer callbackfunc){	GtkWidget *button;	button = gtk_button_new_with_label(caption);	gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);	if(callbackfunc != NULL)	{		gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(callbackfunc),NULL);	}		return button;}GtkWidget * MakeCheckButton(GtkWidget *box,const gchar* caption,gpointer callbackfunc){	GtkWidget *button;	button = gtk_check_button_new_with_label(caption);	gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);	if(callbackfunc != NULL)	{		gtk_signal_connect(GTK_OBJECT(button),"toggled",GTK_SIGNAL_FUNC(callbackfunc),NULL);	}	return button;}GtkWidget * MakeEntry(GtkWidget *box){	GtkWidget *entry;	entry = gtk_entry_new();	gtk_box_pack_start(GTK_BOX(box),entry,FALSE,FALSE,0);	return entry;}GtkWidget * MakeCombo(GtkWidget *box,GList *items,gpointer callbackfunc){	GtkWidget *combo;	combo = gtk_combo_new();	gtk_combo_set_popdown_strings(GTK_COMBO (combo), items);	//gtk_combo_set_value_in_list (GTK_COMBO(combo),TRUE,FALSE);	gtk_box_pack_start(GTK_BOX(box),combo,FALSE,FALSE,0);	if(callbackfunc != NULL)	{		gtk_signal_connect(GTK_OBJECT(GTK_COMBO(combo)->list),"select-child",				GTK_SIGNAL_FUNC(callbackfunc),NULL);	}	gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo)->entry),FALSE);		gtk_widget_set_size_request(combo,100,20);	return combo;	}GtkWidget * MakeComboWithLabel(GtkWidget *box,GList *items,	gpointer callbackfunc,const gchar* labeltext){	GtkWidget *combo;	GtkWidget *temphbox;	GtkWidget *label;		temphbox = gtk_hbox_new(FALSE,5);	gtk_box_pack_start(GTK_BOX(box),temphbox,FALSE,FALSE,0);		label = gtk_label_new(labeltext);	gtk_box_pack_start(GTK_BOX(temphbox),label,FALSE,FALSE,0);	combo = MakeCombo(temphbox,items,callbackfunc);	return combo;}GtkWidget * MakeTextView(GtkWidget *box,guint width,guint height){	GtkWidget *view;	GtkTextBuffer *buffer;	GtkWidget *view_scroll_window;		view_scroll_window = gtk_scrolled_window_new(NULL,NULL);	gtk_container_set_border_width (GTK_CONTAINER (view_scroll_window),0);	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (view_scroll_window),			GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);	gtk_box_pack_start(GTK_BOX(box),view_scroll_window,FALSE,FALSE,0);	view = gtk_text_view_new();	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(view));		gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view),GTK_WRAP_CHAR);	gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view),10);	gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view),10);		gtk_container_add(GTK_CONTAINER(view_scroll_window),view);		gtk_widget_set_size_request(view,width,height);		return view;	}gint MakeAppView(GtkWidget *AppWindow){	GtkWidget *mainbox;	GtkWidget *main_h1_vbox,*main_h2_vbox;	GtkWidget *main_h2_v1_hbox;	GtkWidget *main_h2_v2_hbox;	GtkWidget *tempbox;		GList *items_tty = NULL;	GList *items_baud = NULL;	GList *items_bits = NULL;	GList *items_check = NULL;		mainbox = gtk_hbox_new(FALSE,10);	main_h1_vbox = gtk_vbox_new(FALSE,10);	main_h2_vbox = gtk_vbox_new(FALSE,10);	// ----------  add tty select combo box ---------------	items_tty = g_list_append (items_tty, "/dev/ttyS0");	items_tty = g_list_append (items_tty, "/dev/ttyS1");	items_tty = g_list_append (items_tty, "/dev/ttyS2");	items_tty = g_list_append (items_tty, "/dev/ttyS3");	combo_select_tty = MakeComboWithLabel(main_h1_vbox,items_tty,			combo_select_tty_selectchild,"端口:  ");	gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_tty)->list),0);	//------------------------------------------------------	// ----------  add baud rate select combo box ----------	items_baud = g_list_append (items_baud, "300");	items_baud = g_list_append (items_baud, "600");	items_baud = g_list_append (items_baud, "1200");	items_baud = g_list_append (items_baud, "1800");	items_baud = g_list_append (items_baud, "2400");	items_baud = g_list_append (items_baud, "4800");	items_baud = g_list_append (items_baud, "9600");	items_baud = g_list_append (items_baud, "19200");	items_baud = g_list_append (items_baud, "38400");	items_baud = g_list_append (items_baud, "57600");	items_baud = g_list_append (items_baud, "115200");	combo_select_baud = MakeComboWithLabel(main_h1_vbox,items_baud,			combo_select_baud_selectchild,"波特率:");	gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_baud)->list),10);	//------------------------------------------------------		// --------- add bits per byte select combo box ----------	items_bits = g_list_append (items_bits, "5");	items_bits = g_list_append (items_bits, "6");	items_bits = g_list_append (items_bits, "7");	items_bits = g_list_append (items_bits, "8");	combo_select_bits = MakeComboWithLabel(main_h1_vbox,items_bits,			combo_select_bits_selectchild,"比特:  ");	gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_bits)->list),3);	//---------------------------------------------------------	//---------- add odd/even check select combo box ----------	items_check = g_list_append (items_check, "None");	items_check = g_list_append (items_check, "Odd");	items_check = g_list_append (items_check, "Even");	combo_select_check = MakeComboWithLabel(main_h1_vbox,items_check,			combo_select_check_selectchild,"校验和:");	gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_check)->list),0);	//--------------------------------------------------------		//---------- add open/close serial button ---------------------------------	button_open_close_tty = MakeButton(main_h1_vbox,"打开串口",button_open_close_tty_clicked);	//---------------------------------------------------------------------------	//---------- add input count utility --------------------------------------	tempbox =  gtk_hbox_new(FALSE,5);	gtk_box_pack_start(GTK_BOX(main_h1_vbox),tempbox,FALSE,FALSE,0);	gtk_box_pack_start(GTK_BOX(tempbox),gtk_label_new("输入计数"),FALSE,FALSE,0);	entry_read_count = MakeEntry(tempbox);	gtk_widget_set_size_request(entry_read_count,60,20);	gtk_entry_set_editable(GTK_ENTRY(entry_read_count),FALSE);	update_read_count(ReadCount);	MakeButton(tempbox,"清除计数",button_clear_read_count_clicked);	//---------- add output count utility --------------------------------------	tempbox =  gtk_hbox_new(FALSE,5);	gtk_box_pack_start(GTK_BOX(main_h1_vbox),tempbox,FALSE,FALSE,0);	gtk_box_pack_start(GTK_BOX(tempbox),gtk_label_new("输出计数"),FALSE,FALSE,0);	entry_write_count = MakeEntry(tempbox);	gtk_widget_set_size_request(entry_write_count,60,20);	gtk_entry_set_editable(GTK_ENTRY(entry_write_count),FALSE);	update_write_count(WriteCount);	MakeButton(tempbox,"清除计数",button_clear_write_count_clicked);		//---------- add input view window  ---------------------------------------	//entry_input = MakeEntry(main_h2_vbox);	TV_input = MakeTextView(main_h2_vbox,400,100);	//---------- add hex input,send,clear input,read button -------------------	main_h2_v1_hbox = gtk_hbox_new(FALSE,15);	gtk_box_pack_start(GTK_BOX(main_h2_vbox),main_h2_v1_hbox,FALSE,FALSE,0);	MakeCheckButton(main_h2_v1_hbox,"16进制",button_input_hex_toggled);	button_send = MakeButton(main_h2_v1_hbox,"发送数据",button_send_clicked);	MakeButton(main_h2_v1_hbox,"清除输入区域",button_clear_input_clicked);	MakeButton(main_h2_v1_hbox,"读取数据",button_read_clicked);	//----------------------------------------------------------------------------		//------------ add output view window ----------------------------------------	TV_Info_Display = MakeTextView(main_h2_vbox,400,150);	gtk_text_buffer_get_start_iter(			gtk_text_view_get_buffer(GTK_TEXT_VIEW(TV_Info_Display)),&TV_Info_Disp_Iter);	gtk_text_view_set_editable(GTK_TEXT_VIEW(TV_Info_Display),FALSE);	create_tags(gtk_text_view_get_buffer(GTK_TEXT_VIEW(TV_Info_Display)));	//---------------------------------------------------------------------------		//------------- add hex,clear,pause,save buttons -----------------------------	main_h2_v2_hbox = gtk_hbox_new(FALSE,5);	gtk_box_pack_start(GTK_BOX(main_h2_vbox),main_h2_v2_hbox,FALSE,FALSE,0);	MakeCheckButton(main_h2_v2_hbox,"16进制",button_output_hex_toggled);	button_ignore_unprintable = MakeCheckButton(main_h2_v2_hbox,"忽略控制字符"			,button_ignore_unprintable_toggled);	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_ignore_unprintable),TRUE);	gtk_widget_set_sensitive(button_ignore_unprintable,TRUE);		MakeButton(main_h2_v2_hbox,"清除显示区域",button_clear_output_clicked);	MakeButton(main_h2_v2_hbox,"暂停",button_pause_clicked);	MakeButton(main_h2_v2_hbox,"保存数据",button_save_clicked);	//-----------------------------------------------------------------------------		gtk_box_pack_start(GTK_BOX(mainbox),main_h1_vbox,TRUE,FALSE,0);	gtk_box_pack_start(GTK_BOX(mainbox),main_h2_vbox,TRUE,FALSE,0);	gtk_container_add(GTK_CONTAINER(AppWindow),mainbox);		return 0;}void readserial(gpointer data,gint fd,GdkInputCondition condition){	char line[MAX_LINE_LENGTH];	char dispdata[MAX_LINE_LENGTH*3+1];	char achar[3];	gint readsize;	guint position;	guint char_count;	gint i;	GtkTextBuffer *TV_Info_Display_buffer;	GtkTextIter start,end;	gboolean has_unprintable_char = FALSE;		TV_Info_Display_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(TV_Info_Display));		readsize = tty_read_data(fd,line,MAX_LINE_LENGTH);	g_assert(readsize != -1);	if( DispPaused )		return;	ReadCount += readsize;	update_read_count(ReadCount);		if( OutputHex )	{		for(i=0;i<readsize;i++)		{			sprintf(achar,"%02X",line[i]);			dispdata[(i)*3] = achar[0];			dispdata[(i)*3+1] = achar[1];			dispdata[(i)*3+2] = ' ';		}		dispdata[readsize*3] = '\0';		gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&TV_Info_Disp_Iter,-1);		gtk_text_buffer_insert(TV_Info_Display_buffer,&TV_Info_Disp_Iter,dispdata,-1);						gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(TV_Info_Display),				&TV_Info_Disp_Iter,0.0,FALSE,0.0,1.0);	}	else	{		position = 0;		if ( IgnoreUnprintable )		{			for(i=0;i<readsize;i++)			{				//	Judge if the char is printable or is the \r\n char				if ( isprint(line[i]) || (line[i] == 0x0A) || (line[i] == 0x0D) )				{					dispdata[position++] = line[i];				}			}		}		else		{			for(i=0;i<readsize;i++)			{				//	Judge if the char is printable or is the \r\n char				if ( isprint(line[i]) || (line[i] == 0x0A) || (line[i] == 0x0D) )				{					if (has_unprintable_char)					{						dispdata[position] = '\0';						gtk_text_buffer_insert_with_tags_by_name(TV_Info_Display_buffer,								            &TV_Info_Disp_Iter,dispdata,-1,"bold","red-foreground",NULL);						position = 0;						has_unprintable_char = FALSE;					}					dispdata[position++] = line[i];				}				else				{					if (!has_unprintable_char)					{						dispdata[position] = '\0';						gtk_text_buffer_insert(TV_Info_Display_buffer,								&TV_Info_Disp_Iter,dispdata,-1);						position = 0;						has_unprintable_char = TRUE;					}					sprintf(achar,"%02X",line[i]);					dispdata[position++] = achar[0];					dispdata[position++] = achar[1];				}			}		}				dispdata[position] = '\0';		gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&TV_Info_Disp_Iter,-1);		gtk_text_buffer_insert(TV_Info_Display_buffer,&TV_Info_Disp_Iter,dispdata,-1);		//----- test code --------		//gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&TV_Info_Disp_Iter,-1);		//gtk_text_buffer_insert(TV_Info_Display_buffer,&TV_Info_Disp_Iter,"--------\r\n",-1);		//------------------------				gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(TV_Info_Display),				&TV_Info_Disp_Iter,0.0,FALSE,0.0,1.0);	}	//------------  if char number in buffer great than the ---------------------	//--------- MAX_DISP_BUFFER_SIZE then drop first 20% of them ----------------	char_count = gtk_text_buffer_get_char_count(TV_Info_Display_buffer);	if (char_count > MAX_DISP_BUFFER_SIZE)	{		gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&start,0);		gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&end,				(char_count - MAX_DISP_BUFFER_SIZE/5*4));		gtk_text_buffer_delete(TV_Info_Display_buffer,&start,&end);	}}		gint main(gint argc, gchar *argv[]){	gtk_init(&argc,&argv);	AppWindow = MakeAppWindow();	MakeAppView(AppWindow);	gtk_widget_show_all(AppWindow);		gtk_main();	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -